• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 保存用户文件
2
3在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。
4
5对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。
6
7当前所有picker的save接口都是用户可感知的,具体行为是拉起FilePicker, 将文件保存在系统文件管理器管理的特定目录,与图库管理的资源隔离,无法在图库中看到。
8
9如需要在图库中看到所保存的图片、视频资源,请使用用户无感的[安全控件创建媒体资源](../media/medialibrary/photoAccessHelper-resource-guidelines.md#使用安全控件创建媒体资源)。
10
11
12## 保存图片或视频类文件
13
14本例展示了从图库中选择一张图片,保存到文件管理器的示例代码。
15
161. 导入[选择器](../reference/apis-core-file-kit/js-apis-file-picker.md)、[文件管理](../reference/apis-core-file-kit/js-apis-file-fs.md)、[相册管理](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md)模块。
17
18   ```ts
19   import picker from '@ohos.file.picker';
20   import fs from '@ohos.file.fs';
21   import photoAccessHelper from '@ohos.file.photoAccessHelper';
22   ```
23
242. 调用[select()](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#select)接口从设备中选择一张图片,并用一个全局变量存储返回的uri。
25
26   ```ts
27   import photoAccessHelper from '@ohos.file.photoAccessHelper';
28   import { BusinessError } from '@ohos.base';
29
30   let selectUris: Array<string> = [];
31   try {
32      let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
33      PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
34      PhotoSelectOptions.maxSelectNumber = 1;
35      let photoPicker = new photoAccessHelper.PhotoViewPicker();
36      photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
37         selectUris = PhotoSelectResult.photoUris;
38         console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
39      }).catch((err: BusinessError) => {
40         console.error(`PhotoViewPicker.select failed with err: ${err.code}, ${err.message}`);
41      });
42   } catch (error) {
43      let err: BusinessError = error as BusinessError;
44      console.error(`PhotoViewPicker failed with err: ${err.code}, ${err.message}`);
45   }
46   ```
47
483. 调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,并用一个全局变量存储返回的uri。
49
50   save返回的uri权限是读写权限,可以根据结果集里面的uri进行文件读写等操作。
51
52   ```ts
53   import picker from '@ohos.file.picker';
54   import { BusinessError } from '@ohos.base';
55
56   let saveUris: Array<string> = [];
57   try {
58       const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例
59       photoSaveOptions.newFileNames = ["PhotoViewPicker01.png"]; // 保存文件名(可选),方括号里的文件名自定义,每次不能重复,设备里已有这个文件的话,名字就需要改个不一样的,不然接口会报错
60       const photoViewPicker = new picker.PhotoViewPicker();
61       try {
62           let photoSaveResult = await photoViewPicker.save(photoSaveOptions);
63           if (photoSaveResult != undefined) {
64               saveUris = photoSaveResult;
65               console.info('photoViewPicker.save to file succeed and uris are:' + photoSaveResult);
66           }
67       } catch (error) {
68           let err: BusinessError = error as BusinessError;
69           console.error(`[picker] Invoke photoViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
70       }
71   } catch (error) {
72       let err: BusinessError = error as BusinessError;
73       console.info("[picker] photoViewPickerSave error = " + JSON.stringify(err));
74   }
75   ```
76
774. 使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过选择和保存uri打开这两个文件得到fd,这里需要注意接口权限参数分别是fs.OpenMode.READ_ONLYfs.OpenMode.WRITE_ONLY。再调用[fs.copyFileSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fscopyfilesync)接口进行复制,修改完成后关闭两个文件。
78
79   ```ts
80   import fs from '@ohos.file.fs';
81   import { BusinessError } from '@ohos.base';
82
83   try {
84   	let photoSelect = fs.openSync(selectUris[0], fs.OpenMode.READ_ONLY);
85       let photoSave = fs.openSync(saveUris[0], fs.OpenMode.WRITE_ONLY);
86       fs.copyFileSync(photoSelect.fd, photoSave.fd);
87       fs.close(photoSelect);
88       fs.close(photoSave);
89   } catch (error) {
90       let err: BusinessError = error as BusinessError;
91       console.info("[picker] Photo Save error = " + JSON.stringify(err));
92   }
93   ```
94
95## 保存文档类文件
96
971. 导入选择器模块和文件管理模块。
98
99   ```ts
100   import picker from '@ohos.file.picker';
101   import fs from '@ohos.file.fs';
102   import { BusinessError } from '@ohos.base';
103   ```
104
1052. 创建文档保存选项实例。
106
107   ```ts
108   const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
109   documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // 保存文件名(可选)
110   documentSaveOptions.fileSuffixChoices = ['.png', '.txt', '.mp4']; // 保存文件类型(可选)
111   ```
112
1133. 创建文档选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-3)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
114
115   </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
116
117   ```ts
118   import { BusinessError } from '@ohos.base';
119
120   let uris: Array<string> = [];
121   const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
122   documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
123     uris = documentSaveResult;
124     console.info('documentViewPicker.save to file succeed and uris are:' + uris);
125   }).catch((err: BusinessError) => {
126     console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
127   })
128   ```
129
1304. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE131
132   ```ts
133   import fs from '@ohos.file.fs';
134
135   const uri = '';
136   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
137   console.info('file fd: ' + file.fd);
138   ```
139
1405. 通过fd使用[fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
141
142   ```ts
143   import fs from '@ohos.file.fs';
144
145   let writeLen: number = fs.writeSync(file.fd, 'hello, world');
146   console.info('write data to file succeed and size is:' + writeLen);
147   fs.closeSync(file);
148   ```
149
150## 保存音频类文件
151
1521. 导入选择器模块和文件管理模块。
153
154   ```ts
155   import picker from '@ohos.file.picker';
156   import fs from '@ohos.file.fs';
157   import { BusinessError } from '@ohos.base';
158   ```
159
1602. 创建音频保存选项实例。
161
162   ```ts
163   const audioSaveOptions = new picker.AudioSaveOptions(); // 创建文件管理器选项实例
164   audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; // 保存文件名(可选)
165   ```
166
1673. 创建音频选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-6)接口拉起FilePicker界面进行文件保存。用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
168
169   </br>save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
170
171   ```ts
172   let uri: string = '';
173   const audioViewPicker = new picker.AudioViewPicker();
174   audioViewPicker.save(audioSaveOptions).then((audioSelectResult: Array<string>) => {
175     uri = audioSelectResult[0];
176     console.info('audioViewPicker.save to file succeed and uri is:' + uri);
177   }).catch((err: BusinessError) => {
178     console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
179   })
180   ```
181
1824. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE183
184   ```ts
185   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
186   console.info('file fd: ' + file.fd);
187   ```
188
1895. 通过fd使用[fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭fd。
190
191   ```ts
192   let writeLen = fs.writeSync(file.fd, 'hello, world');
193   console.info('write data to file succeed and size is:' + writeLen);
194   fs.closeSync(file);
195   ```
196
197
198