• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 选择用户文件
2
3用户有时需要分享或保存图片、视频等用户文件,开发者可以通过系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现该能力。通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。
4
5根据用户文件的常见类型,选择器(FilePicker)分别提供以下接口:
6
7- [PhotoViewPicker](../reference/apis/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类型文件的选择与保存。优选使用[PhotoAccessHelper的PhotoViewPicker](../reference/apis/js-apis-photoAccessHelper.md#photoviewpicker)来选择文件。当前PhotoViewPicker对接的选择资源来自于图库,保存位置为系统文件管理器的特定目录,因此使用save接口保存的图片或视频无法在图库中展示。如需在图库中展示,请使用[安全控件创建媒体资源](photoAccessHelper-resource-guidelines.md#使用安全控件创建媒体资源)。
8
9- [DocumentViewPicker](../reference/apis/js-apis-file-picker.md#documentviewpicker):适用于文件类型文件的选择与保存。DocumentViewPicker对接的选择资源来自于FilePicker, 负责文件类型的资源管理,文件类型不区分后缀,比如浏览器下载的图片、文档等,都属于文件类型。
10
11- [AudioViewPicker](../reference/apis/js-apis-file-picker.md#audioviewpicker):适用于音频类型文件的选择与保存。AudioViewPicker目前对接的选择资源来自于FilePicker。
12
13## 选择图片或视频类文件
14
151. 导入选择器模块和文件管理模块。
16
17   ```ts
18   import picker from '@ohos.file.picker';
19   import fs from '@ohos.file.fs';
20   import { BusinessError } from '@ohos.base';
21   ```
22
232. 创建图片-音频类型文件选择选项实例。
24
25   ```ts
26   import picker from '@ohos.file.picker';
27
28   const photoSelectOptions = new picker.PhotoSelectOptions();
29   ```
30
313. 选择媒体文件类型和选择媒体文件的最大数目。
32   以下示例以图片选择为例,媒体文件类型请参见[PhotoViewMIMETypes](../reference/apis/js-apis-file-picker.md#photoviewmimetypes)。
33
34   ```ts
35   import picker from '@ohos.file.picker';
36
37   photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
38   photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
39   ```
40
414. 创建图库选择器实例,调用[select()](../reference/apis/js-apis-file-picker.md#select)接口拉起图库界面进行文件选择。文件选择成功后,返回[PhotoSelectResult](../reference/apis/js-apis-file-picker.md#photoselectresult)结果集。
42
43   </br>select返回的uri权限是只读权限,可以根据结果集中uri进行读取文件数据操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
44
45   </br>如有获取元数据需求,可以通过[文件管理接口](../reference/apis/js-apis-file-fs.md)和[文件URI](../reference/apis/js-apis-file-fileuri.md)根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。
46
47   ```ts
48   import picker from '@ohos.file.picker';
49   import { BusinessError } from '@ohos.base';
50
51   let uris: Array<string> = [];
52   const photoViewPicker = new picker.PhotoViewPicker();
53   photoViewPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => {
54     uris = photoSelectResult.photoUris;
55     console.info('photoViewPicker.select to file succeed and uris are:' + uris);
56   }).catch((err: BusinessError) => {
57     console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
58   })
59   ```
60
615. 待界面从图库返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY62
63   ```ts
64   import fs from '@ohos.file.fs';
65
66   let uri: string = '';
67   let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
68   console.info('file fd: ' + file.fd);
69   ```
70
716. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
72
73   ```ts
74   import fs from '@ohos.file.fs';
75
76   let buffer = new ArrayBuffer(4096);
77   let readLen = fs.readSync(file.fd, buffer);
78   console.info('readSync data to file succeed and buffer size is:' + readLen);
79   fs.closeSync(file);
80   ```
81
82## 选择文档类文件
83
841. 导入选择器模块和文件管理模块。
85
86   ```ts
87   import picker from '@ohos.file.picker';
88   import fs from '@ohos.file.fs';
89   import Want from '@ohos.app.ability.Want';
90   import { BusinessError } from '@ohos.base';
91   ```
92
932. 创建文件类型文件选择选项实例。
94
95   ```ts
96   import picker from '@ohos.file.picker';
97
98   const documentSelectOptions = new picker.DocumentSelectOptions();
99   documentSelectOptions.maxSelectNumber = 5; // 选择文档的最大数目(可选)
100   documentSelectOptions.defaultFilePathUri = "file://docs/storage/Users/currentUser/test"; // 指定选择的文件或者目录路径(可选)
101   documentSelectOptions.fileSuffixFilters = ['.png', '.txt', '.mp4']; // 选择文件的后缀类型(可选)
102   ```
103
1043. 创建文件选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-3)接口拉起FilePicker应用界面进行文件选择。文件选择成功后,返回被选中文档的uri结果集。
105
106   select返回的uri权限是只读权限,开发者可以根据结果集中uri做进一步的处理。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
107
108   如有获取元数据需求,可以通过[文件管理接口](../reference/apis/js-apis-file-fs.md)和[文件URI](../reference/apis/js-apis-file-fileuri.md)根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。
109
110   ```ts
111   import picker from '@ohos.file.picker';
112   import { BusinessError } from '@ohos.base';
113
114   let uris: Array<string> = [];
115   const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
116   documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
117     uris = documentSelectResult;
118     console.info('documentViewPicker.select to file succeed and uris are:' + uris);
119   }).catch((err: BusinessError) => {
120     console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
121   })
122   ```
123
1244. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY125
126   ```ts
127   import fs from '@ohos.file.fs';
128
129   let uri: string = '';
130   let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
131   console.info('file fd: ' + file.fd);
132   ```
133
1345. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
135
136   ```ts
137   import fs from '@ohos.file.fs';
138
139   let buffer = new ArrayBuffer(4096);
140   let readLen = fs.readSync(file.fd, buffer);
141   console.info('readSync data to file succeed and buffer size is:' + readLen);
142   fs.closeSync(file);
143   ```
144
145## 选择音频类文件
146
1471. 导入选择器模块和文件管理模块。
148
149   ```ts
150   import picker from '@ohos.file.picker';
151   import fs from '@ohos.file.fs';
152   import { BusinessError } from '@ohos.base';
153   ```
154
1552. 创建音频类型文件选择选项实例。
156
157   > **说明:**
158   >
159   > 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
160
161   ```ts
162   import picker from '@ohos.file.picker';
163
164   const audioSelectOptions = new picker.AudioSelectOptions();
165   ```
166
1673. 创建音频选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-6)接口拉起FilePicker应用界面进行文件选择。文件选择成功后,返回被选中音频的uri结果集。
168
169   select返回的uri权限是只读权限,开发者可以根据结果集中uri做读取文件数据操作。注意不能在  picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
170
171   例如通过[文件管理接口](../reference/apis/js-apis-file-fs.md)根据uri拿到音频资源的文件句柄(FD),再配合媒体服务实现音频播放的开发,具体请参考[音频播放开发指导](../media/audio-playback-overview.md)。
172
173   ```ts
174   import picker from '@ohos.file.picker';
175
176   let uri: string = '';
177   const audioViewPicker = new picker.AudioViewPicker();
178   audioViewPicker.select(audioSelectOptions).then((audioSelectResult: Array<string>) => {
179     uri = audioSelectResult[0];
180     console.info('audioViewPicker.select to file succeed and uri is:' + uri);
181   }).catch((err: BusinessError) => {
182     console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
183   })
184   ```
185
1864. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY187
188   ```ts
189   import fs from '@ohos.file.fs';
190
191   let uri: string = '';
192   let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
193   console.info('file fd: ' + file.fd);
194   ```
195
1965. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
197
198   ```ts
199   import fs from '@ohos.file.fs';
200
201   let buffer = new ArrayBuffer(4096);
202   let readLen = fs.readSync(file.fd, buffer);
203   console.info('readSync data to file succeed and buffer size is:' + readLen);
204   fs.closeSync(file);
205   ```
206
207## 相关实例
208
209针对用户文件的选择,有以下相关实例可供参考:
210
211- [选择并查看文档与媒体文件(ArkTS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-4.0-Release/code/BasicFeature/FileManagement/FileShare/Picker)