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

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

5
对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。
Z
zengyawen 已提交
6

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

Z
zengyawen 已提交
9 10 11

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

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

14
1. 导入[选择器](../reference/apis/js-apis-file-picker.md)[文件管理](../reference/apis/js-apis-file-fs.md)[相册管理](../reference/apis/js-apis-photoAccessHelper.md)[数据共享谓词](../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';
21 22 23
   import common from '@ohos.app.ability.common';
   import image from '@ohos.multimedia.image';
   import { BusinessError } from '@ohos.base';
Z
zengyawen 已提交
24 25
   ```

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

Z
zengyawen 已提交
28
   ```ts
29 30
   let context = getContext(this) as common.UIAbilityContext;
   let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
Y
yxn 已提交
31

32
   let pixelmapArrayBuffer: ArrayBuffer;
33
   async function getPixelmap() {
Y
yxn 已提交
34 35
      try {
         let predicates = new dataSharePredicates.DataSharePredicates();
36
         let fetchOption: photoAccessHelper.FetchOptions = {
Y
yxn 已提交
37 38 39
            fetchColumns: [],
            predicates: predicates
         };
40
         let fetchResult = await phAccessHelper.getAssets(fetchOption);
Y
yxn 已提交
41 42 43
         console.info('[picker] getThumbnail fetchResult: ' + fetchResult);
         const asset = await fetchResult.getFirstObject();
         console.info('[picker] getThumbnail asset displayName = ', asset.displayName);
44
         asset.getThumbnail().then((pixelMap: image.PixelMap) => {
Y
yxn 已提交
45 46 47 48 49
            let pixelBytesNumber = pixelMap.getPixelBytesNumber();
            const readBuffer = new ArrayBuffer(pixelBytesNumber);
            pixelMap.readPixelsToBuffer(readBuffer).then(() => {
               pixelmapArrayBuffer = readBuffer;
            })
50
         }).catch((err: BusinessError) => {
51
            console.error('[picker] getThumbnail failed with error: ' + JSON.stringify(err));
Y
yxn 已提交
52 53
         });
      } catch (error) {
54 55
         let err: BusinessError = error as BusinessError;
         console.error('[picker] getThumbnail error = ' + JSON.stringify(err));
Y
yxn 已提交
56 57
      }
   }
Z
zengyawen 已提交
58 59
   ```

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

   ```ts  
65
   let uris: string;
Y
yxn 已提交
66 67 68 69 70 71 72 73 74
   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) {
75 76
               uris = photoSaveResult;
               console.info('photoViewPicker.save to file succeed and uris are:' + uris);
Y
yxn 已提交
77
            }
78 79
         } catch (error) {
            let err: BusinessError = error as BusinessError;
Y
yxn 已提交
80 81 82
            console.error(`[picker] Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
         }
      } catch (error) {
83 84
         let err: BusinessError = error as BusinessError;
         console.info("[picker] photoViewPickerSave error = " + JSON.stringify(err));
Y
yxn 已提交
85 86
      }
   }
87 88
   ```

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

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

   ```ts
94
   async function writeOnly(uri: string) {
Y
yxn 已提交
95 96 97 98 99 100
      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) {
101 102
         let err: BusinessError = error as BusinessError;
         console.info("[picker] writeOnly error: " + JSON.stringify(err));
Y
yxn 已提交
103 104
      }
   }
Z
zengyawen 已提交
105 106 107 108
   ```

## 保存文档类文件

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

Z
zengyawen 已提交
111 112
   ```ts
   import picker from '@ohos.file.picker';
H
huweiqi 已提交
113
   import fs from '@ohos.file.fs';
114
   import { BusinessError } from '@ohos.base';
Z
zengyawen 已提交
115 116 117
   ```

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

Z
zengyawen 已提交
119 120 121
   ```ts
   const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
   documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // 保存文件名(可选)
122
   documentSaveOptions.fileSuffixChoices = ['.png', '.txt', '.mp4']; // 保存文件类型(可选)
Z
zengyawen 已提交
123 124
   ```

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

   ```ts
130
   let uris: Array<string>;
Z
zengyawen 已提交
131
   const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
132
   documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
133 134
     uris = documentSaveResult;
     console.info('documentViewPicker.save to file succeed and uris are:' + uris);
135
   }).catch((err: BusinessError) => {
H
huweiqi 已提交
136
     console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
137 138 139
   })
   ```

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

   ```ts
H
huweiqi 已提交
143
   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
144 145 146
   console.info('file fd: ' + file.fd);
   ```

147
5. 通过fd使用[fs.writeSync](../reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
148 149 150 151 152

   ```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 已提交
153 154 155 156
   ```

## 保存音频类文件

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

Z
zengyawen 已提交
159 160
   ```ts
   import picker from '@ohos.file.picker';
H
huweiqi 已提交
161
   import fs from '@ohos.file.fs';
162
   import { BusinessError } from '@ohos.base';
Z
zengyawen 已提交
163 164 165
   ```

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

Z
zengyawen 已提交
167 168 169 170 171
   ```ts
   const audioSaveOptions = new picker.AudioSaveOptions(); // 创建文件管理器选项实例
   audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; // 保存文件名(可选)
   ```

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

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

   ```ts
H
huweiqi 已提交
190
   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
191 192 193
   console.info('file fd: ' + file.fd);
   ```

194
5. 通过fd使用[fs.writeSync](../reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
195 196 197 198 199

   ```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 已提交
200
   ```
201