save-user-file.md 9.3 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4
# 保存用户文件

在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。

Y
yxn 已提交
5
对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。此类接口不需要申请任何权限。
Z
zengyawen 已提交
6

Y
yxn 已提交
7 8
save接口会将文件保存在文件管理器,而不是图库。

Z
zengyawen 已提交
9 10 11

## 保存图片或视频类文件

Y
yxn 已提交
12 13 14
本例展示了从图库中选择一张图片,保存到文件管理器的示例代码。

1. 导入[选择器](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-file-picker.md)[文件管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-file-fs.md)[相册管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-photoAccessHelper.md)[数据共享谓词](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-data-dataSharePredicates.md)模块。
Z
zengyawen 已提交
15

Z
zengyawen 已提交
16 17
   ```ts
   import picker from '@ohos.file.picker';
H
huweiqi 已提交
18
   import fs from '@ohos.file.fs';
Y
yxn 已提交
19 20
   import photoAccessHelper from '@ohos.file.photoAccessHelper';
   import dataSharePredicates from '@ohos.data.dataSharePredicates';
Z
zengyawen 已提交
21 22
   ```

Y
yxn 已提交
23
2. 获取设备里第一张图片的缩略图。注意:在执行这一步之前,要先确保设备里至少有一张图片。
Z
zengyawen 已提交
24

Z
zengyawen 已提交
25
   ```ts
Y
yxn 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
   const context = getContext(this);
   let photoAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

   let pixelmapArrayBuffer;
   async getPixelmap() {
      try {
         let predicates = new dataSharePredicates.DataSharePredicates();
         let fetchOption = {
            fetchColumns: [],
            predicates: predicates
         };
         let fetchResult = await photoAccessHelper.getAssets(fetchOption);
         console.info('[picker] getThumbnail fetchResult: ' + fetchResult);
         const asset = await fetchResult.getFirstObject();
         console.info('[picker] getThumbnail asset displayName = ', asset.displayName);
         asset.getThumbnail().then((pixelMap) => {
            let pixelBytesNumber = pixelMap.getPixelBytesNumber();
            const readBuffer = new ArrayBuffer(pixelBytesNumber);
            pixelMap.readPixelsToBuffer(readBuffer).then(() => {
               pixelmapArrayBuffer = readBuffer;
            })
         }).catch((err) => {
            console.error('[picker] getThumbnail failed with error: ' + err);
         });
      } catch (error) {
         console.error('[picker] getThumbnail error = ' + error);
      }
   }
Z
zengyawen 已提交
54 55
   ```

Y
yxn 已提交
56
3. 创建图库选择器实例,调用[save()](../reference/apis/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存图片的uri。
H
huweiqi 已提交
57
   
Y
yxn 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
   save返回的uri权限是读写权限,可以根据结果集里面的uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。

   ```ts  
   let uri:string;
   async photoViewPickerSave() {
      try {
         const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例
         photoSaveOptions.newFileNames = ["PhotoViewPicker01.png"]; // 保存文件名(可选),方括号里的文件名自定义,每次不能重复,设备里已有这个文件的话,名字就需要改个不一样的,不然接口会报错

         const photoViewPicker = new picker.PhotoViewPicker();
         try {
            let photoSaveResult = await photoViewPicker.save(photoSaveOptions);
            if (photoSaveResult != undefined) {
               console.info("[picker] photoViewPickerSave photoSaveResult = " + JSON.stringify(photoSaveResult));
               this.uri = photoSaveResult[0];
               console.info('photoViewPicker.save to file succeed and uri is:' + photoSaveResult[0]);
            }
         } catch (err) {
            console.error(`[picker] Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
         }
      } catch (error) {
         console.info("[picker] photoViewPickerSave error = " + error);
      }
   }
82 83
   ```

H
huweiqi 已提交
84
4. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。
85

Y
yxn 已提交
86
   然后,通过fd使用[fs.write](../reference/apis/js-apis-file-fs.md#fswrite)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
87 88

   ```ts
Y
yxn 已提交
89 90 91 92 93 94 95 96 97 98
   async writeOnly(uri) {
      try {
         let file = fs.openSync(uri, fs.OpenMode.WRITE_ONLY);
         let writeLen = await fs.write(file.fd, pixelmapArrayBuffer);
         fs.closeSync(file);
         console.info("[picker] writeOnly writeLen = " + writeLen);
      } catch (error) {
         console.info("[picker] writeOnly error: " + error);
      }
   }
Z
zengyawen 已提交
99 100 101 102
   ```

## 保存文档类文件

H
huweiqi 已提交
103
1. 导入选择器模块和文件管理模块。
Z
zengyawen 已提交
104

Z
zengyawen 已提交
105 106
   ```ts
   import picker from '@ohos.file.picker';
H
huweiqi 已提交
107
   import fs from '@ohos.file.fs';
Z
zengyawen 已提交
108 109 110
   ```

2. 创建文档保存选项实例。
Z
zengyawen 已提交
111

Z
zengyawen 已提交
112 113 114 115 116
   ```ts
   const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
   documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // 保存文件名(可选)
   ```

H
huweiqi 已提交
117
3. 创建文档选择器实例。调用[save()](../reference/apis/js-apis-file-picker.md#save-3)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
H
huweiqi 已提交
118
   
H
huweiqi 已提交
119
   </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
Z
zengyawen 已提交
120 121

   ```ts
H
huweiqi 已提交
122
   let uri = null;
Z
zengyawen 已提交
123
   const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
124
   documentViewPicker.save(documentSaveOptions).then((documentSaveResult) => {
H
huweiqi 已提交
125 126
     uri = documentSaveResult[0];
     console.info('documentViewPicker.save to file succeed and uri is:' + uri);
127
   }).catch((err) => {
H
huweiqi 已提交
128
     console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
129 130 131
   })
   ```

H
huweiqi 已提交
132
4. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。
133 134

   ```ts
H
huweiqi 已提交
135
   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
136 137 138
   console.info('file fd: ' + file.fd);
   ```

139
5. 通过fd使用[fs.writeSync](../reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
140 141 142 143 144

   ```ts
   let writeLen = fs.writeSync(file.fd, 'hello, world');
   console.info('write data to file succeed and size is:' + writeLen);
   fs.closeSync(file);
Z
zengyawen 已提交
145 146 147 148
   ```

## 保存音频类文件

H
huweiqi 已提交
149
1. 导入选择器模块和文件管理模块。
Z
zengyawen 已提交
150

Z
zengyawen 已提交
151 152
   ```ts
   import picker from '@ohos.file.picker';
H
huweiqi 已提交
153
   import fs from '@ohos.file.fs';
Z
zengyawen 已提交
154 155 156
   ```

2. 创建音频保存选项实例。
Z
zengyawen 已提交
157

Z
zengyawen 已提交
158 159 160 161 162
   ```ts
   const audioSaveOptions = new picker.AudioSaveOptions(); // 创建文件管理器选项实例
   audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; // 保存文件名(可选)
   ```

H
huweiqi 已提交
163
3. 创建音频选择器实例。调用[save()](../reference/apis/js-apis-file-picker.md#save-6)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
H
huweiqi 已提交
164
   
H
huweiqi 已提交
165
   </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
H
huweiqi 已提交
166
   
Z
zengyawen 已提交
167
   ```ts
H
huweiqi 已提交
168
   let uri = null;
Z
zengyawen 已提交
169
   const audioViewPicker = new picker.AudioViewPicker();
170
   audioViewPicker.save(audioSaveOptions).then((audioSelectResult) => {
H
huweiqi 已提交
171 172
     uri = audioSelectResult[0];
     console.info('audioViewPicker.save to file succeed and uri is:' + uri);
173
   }).catch((err) => {
H
huweiqi 已提交
174
     console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
175 176 177
   })
   ```

H
huweiqi 已提交
178
4. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。
179 180

   ```ts
H
huweiqi 已提交
181
   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
182 183 184
   console.info('file fd: ' + file.fd);
   ```

185
5. 通过fd使用[fs.writeSync](../reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
186 187 188 189 190

   ```ts
   let writeLen = fs.writeSync(file.fd, 'hello, world');
   console.info('write data to file succeed and size is:' + writeLen);
   fs.closeSync(file);
Z
zengyawen 已提交
191
   ```
192