• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 保存用户文件
2
3在从网络下载文件到本地、或将已有用户文件另存为新的文件路径等场景下,需要使用FilePicker提供的保存用户文件的能力。Picker获取的URI只具有临时权限,获取持久化权限需要通过[FilePicker设置永久授权](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)方式获取。
4
5对音频、图片、视频、文档类文件的保存操作类似,均通过调用对应Picker的save()接口并传入对应的saveOptions来实现。通过Picker访问相关文件,无需申请权限。
6
7当前所有Picker的save接口都是用户可感知的,具体行为是拉起FilePicker, 将文件保存在系统文件管理器管理的特定目录,与图库管理的资源隔离,无法在图库中看到。
8
9如需要在图库中看到所保存的图片、视频资源,请使用用户无感的[安全控件创建媒体资源](../media/medialibrary/photoAccessHelper-savebutton.md#使用安全控件创建媒体资源)。
10
11
12## 保存图片或视频类文件
13
14[PhotoViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#photoviewpicker)在后续版本不再演进,建议使用[安全控件创建媒体资源](../media/medialibrary/photoAccessHelper-savebutton.md#使用安全控件创建媒体资源)。
15
16如果开发场景无法调用安全控件进行图片、视频保存,可使用相册管理模块[PhotoAccessHelper.showAssetsCreationDialog](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#showassetscreationdialog12)接口进行保存操作。
17
18## 保存文档类文件
19
201. 导入选择器模块和基础文件API模块。
21
22   ```ts
23   import { picker } from '@kit.CoreFileKit';
24   import { fileIo as fs } from '@kit.CoreFileKit';
25   import { BusinessError } from '@kit.BasicServicesKit';
26   import { common } from '@kit.AbilityKit';
27   ```
28
292. 创建文档保存选项实例。
30
31   ```ts
32   // 创建文件管理器选项实例
33   const documentSaveOptions = new picker.DocumentSaveOptions();
34   // 保存文件名(可选)
35   documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"];
36   // 保存文件类型['后缀类型描述|后缀类型'],选择所有文件:'所有文件(*.*)|.*'(可选) ,如果选择项存在多个后缀,默认选择第一个。
37   documentSaveOptions.fileSuffixChoices = ['文档|.txt', '.pdf'];
38   ```
39
403. 创建[文件选择器DocumentViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#constructor12)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。
41
42   ```ts
43   let uris: Array<string> = [];
44   // 请确保 getContext(this) 返回结果为 UIAbilityContext
45   let context = getContext(this) as common.Context;
46   // 创建文件选择器实例。
47   const documentViewPicker = new picker.DocumentViewPicker(context);
48   //用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的URI。
49   documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
50     uris = documentSaveResult;
51     console.info('documentViewPicker.save to file succeed and uris are:' + uris);
52   }).catch((err: BusinessError) => {
53     console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
54   })
55   ```
56
57> **注意**:
58> <br>**1**、建议不在Picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI。
59> <br>**2**、使用Picker的[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接口获取到URI的权限是临时读写权限,待退出应用后台后,获取的临时权限就会失效。
60> <br>**3**、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。
61> <br>**4**、可以通过便捷方式,直接将文件保存到[Download](#download模式保存文件)目录下。
62
634. 待界面从FilePicker返回后,使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到文件描述符(fd)。
64
65   ```ts
66   const uri = '';
67   //这里需要注意接口权限参数是fs.OpenMode.READ_WRITE68   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
69   console.info('file fd: ' + file.fd);
70   ```
71
725. 通过(fd)使用[基础文件API的fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭(fd)。
73
74   ```ts
75   let writeLen: number = fs.writeSync(file.fd, 'hello, world');
76   console.info('write data to file succeed and size is:' + writeLen);
77   fs.closeSync(file);
78   ```
79
80## 保存音频类文件
81
821. 导入选择器模块和基础文件API模块。
83
84   ```ts
85   import { picker } from '@kit.CoreFileKit';
86   import { fileIo as fs } from '@kit.CoreFileKit';
87   import { BusinessError } from '@kit.BasicServicesKit';
88   import { common } from '@kit.AbilityKit';
89   ```
90
912. 创建音频保存选项实例。
92
93   ```ts
94   // 创建文件管理器选项实例
95   const audioSaveOptions = new picker.AudioSaveOptions();
96   // 保存文件名(可选)
97   audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3'];
98   ```
99
1003. 创建[音频选择器AudioViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#audioviewpicker)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-5)接口拉起FilePicker界面进行文件保存。
101   ```ts
102   let uri: string = '';
103   // 请确保 getContext(this) 返回结果为 UIAbilityContext
104   let context = getContext(this) as common.Context;
105   const audioViewPicker = new picker.AudioViewPicker(context);
106   //用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的uri。
107   audioViewPicker.save(audioSaveOptions).then((audioSelectResult: Array<string>) => {
108     uri = audioSelectResult[0];
109     console.info('audioViewPicker.save to file succeed and uri is:' + uri);
110   }).catch((err: BusinessError) => {
111     console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
112   })
113   ```
114> **注意**:
115> <br>**1**、建议不在Picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI。
116> <br>**2**、使用Picker获取的[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-3)URI权限是临时读写权限,待退出应用后台后,获取的临时权限就会失效。
117> <br>**3**、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。
118> <br>**4**、可以通过便捷方式,直接将文件保存到[Download](#download模式保存文件)目录下。
119
1204. 待界面从FilePicker返回后,可以使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到文件描述符(fd)。
121
122   ```ts
123   //这里需要注意接口权限参数是fileIo.OpenMode.READ_WRITE124   let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
125   console.info('file fd: ' + file.fd);
126   ```
127
1285. 通过(fd)使用[基础文件API的fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改,编辑修改完成后关闭(fd)。
129
130   ```ts
131   let writeLen = fs.writeSync(file.fd, 'hello, world');
132   console.info('write data to file succeed and size is:' + writeLen);
133   fs.closeSync(file);
134
135   ```
136## DOWNLOAD模式保存文件
137
138用户在使用save接口时,可以将pickerMode配置为DOWNLOAD模式,该模式下会拉起授权接口,用户确认后会在公共路径download目录下创建用户当前hap包名的文件夹,并通过save接口返回值回传相应的URI,后续用户可以直接将文件保存在该URI下。
1391. 导入选择器模块和文件管理模块。
140
141   ```ts
142   import { picker } from '@kit.CoreFileKit';
143   import { fileIo as fs } from '@kit.CoreFileKit';
144   import { BusinessError } from '@kit.BasicServicesKit';
145   import { common } from '@kit.AbilityKit';
146   ```
147
1482. 创建文件保存选项实例。
149
150   ```ts
151   // 创建文件管理器选项实例
152   const documentSaveOptions = new picker.DocumentSaveOptions();
153   // 配置保存的模式为DOWNLOAD,若配置了DOWNLOAD模式,此时配置的其他documentSaveOptions参数将不会生效。
154   documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
155   ```
156
1573. 创建文件选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-1)接口拉起FilePicker模态窗界面进行文件保存。用户点击同意,即可在download目录下创建对应应用的专属目录,返回该目录的URI。
158
159   ```ts
160   let uri: string = '';
161   // 请确保 getContext(this) 返回结果为 UIAbilityContext
162   let context = getContext(this) as common.Context;
163   const documentViewPicker = new picker.DocumentViewPicker(context);
164   const documentSaveOptions = new picker.DocumentSaveOptions();
165   documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD;
166   documentViewPicker.save(documentSaveOptions ).then((documentSaveResult: Array<string>) => {
167     uri = documentSaveResult[0];
168     console.info('documentViewPicker.save succeed and uri is:' + uri);
169   }).catch((err: BusinessError) => {
170     console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
171   })
172   ```
173
174