• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 选择用户文件
2
3终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。
4
5根据用户文件的常见类型,文件选择器(FilePicker)分别提供以下接口:
6
7- [PhotoViewPicker](../reference/apis/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类文件的选择与保存。
8
9- [DocumentViewPicker](../reference/apis/js-apis-file-picker.md#documentviewpicker):适用于文档类文件的选择与保存。
10
11- [AudioViewPicker](../reference/apis/js-apis-file-picker.md#audioviewpicker):适用于音频类文件的选择与保存。
12
13## 选择图片或视频类文件
14
151. 导入选择器模块和文件管理模块。
16
17   ```ts
18   import picker from '@ohos.file.picker';
19   import fs from '@ohos.file.fs';
20   ```
21
222. 创建图库选择选项实例。
23
24   ```ts
25   const photoSelectOptions = new picker.PhotoSelectOptions();
26   ```
27
283. 选择媒体文件类型和选择媒体文件的最大数目。
29   以下示例以图片选择为例,媒体文件类型请参见[PhotoViewMIMETypes](../reference/apis/js-apis-file-picker.md#photoviewmimetypes)。
30
31   ```ts
32   photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
33   photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
34   ```
35
364. 创建图库选择器实例,调用[select()](../reference/apis/js-apis-file-picker.md#select)接口拉起FilePicker界面进行文件选择。文件选择成功后,返回[PhotoSelectResult](../reference/apis/js-apis-file-picker.md#photoselectresult)结果集。
37
38   </br>select返回的URI权限是只读权限,可以根据结果集中URI进行读取文件数据操作。注意不能在picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI,使用类似一个按钮去触发打开文件。
39
40   ```ts
41   let URI = null;
42   const photoViewPicker = new picker.PhotoViewPicker();
43   photoViewPicker.select(photoSelectOptions).then((photoSelectResult) => {
44     URI = photoSelectResult.photoUris[0];
45     console.info('photoViewPicker.select to file succeed and URI is:' + URI);
46   }).catch((err) => {
47     console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
48   })
49   ```
50
515. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY52
53   ```ts
54   let file = fs.openSync(URI, fs.OpenMode.READ_ONLY);
55   console.info('file fd: ' + file.fd);
56   ```
57
586. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
59
60   ```ts
61   let buffer = new ArrayBuffer(4096);
62   let readLen = fs.readSync(file.fd, buffer);
63   console.info('readSync data to file succeed and buffer size is:' + readLen);
64   fs.closeSync(file);
65   ```
66
67## 选择文档类文件
68
691. 导入选择器模块和文件管理模块。
70
71   ```ts
72   import picker from '@ohos.file.picker';
73   import fs from '@ohos.file.fs';
74   ```
75
762. 创建文档选择选项实例。
77
78   ```ts
79   const documentSelectOptions = new picker.DocumentSelectOptions();
80   ```
81
823. 创建文档选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-3)接口拉起FilePicker界面进行文件选择。文件选择成功后,返回被选中文档的URI结果集。
83
84   </br>select返回的URI权限是只读权限,开发者可以根据结果集中URI做进一步的处理。注意不能在picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI,使用类似一个按钮去触发打开文件。
85
86   </br>例如通过[文件管理接口](../reference/apis/js-apis-file-fs.md)根据URI获取部分文件属性信息,比如文件大小、访问时间、修改时间等。如有获取文件名称需求,请暂时使用[startAbilityForResult](../../application-dev/application-models/uiability-intra-device-interaction.md)获取。
87
88   > **说明:**
89   >
90   > 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
91
92   ```ts
93   let URI = null;
94   const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
95   documentViewPicker.select(documentSelectOptions).then((documentSelectResult) => {
96     URI = documentSelectResult[0];
97     console.info('documentViewPicker.select to file succeed and URI is:' + URI);
98   }).catch((err) => {
99     console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
100   })
101   ```
102
103   > **说明:**
104   >
105   > 目前DocumentSelectOptions功能不完整, 如需获取文件名称,请使用startAbilityForResult接口。
106
107   ```ts
108   let config = {
109     action: 'ohos.want.action.OPEN_FILE',
110     parameters: {
111       startMode: 'choose',
112     }
113   }
114   try {
115     let result = await context.startAbilityForResult(config, {windowMode: 1});
116     if (result.resultCode !== 0) {
117       console.error(`documentViewPicker.select failed, code is ${result.resultCode}, message is ${result.want.parameters.message}`);
118       return;
119     }
120     // 获取到文档文件的URI
121     let select_item_list = result.want.parameters.select_item_list;
122     // 获取到文档文件的文件名称
123     let file_name_list = result.want.parameters.file_name_list;
124   } catch (err) {
125     console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
126   }
127   ```
128
1294. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY130
131   ```ts
132   let file = fs.openSync(URI, fs.OpenMode.READ_ONLY);
133   console.info('file fd: ' + file.fd);
134   ```
135
1365. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
137
138   ```ts
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## 选择音频类文件
147
1481. 导入选择器模块和文件管理模块。
149
150   ```ts
151   import picker from '@ohos.file.picker';
152   import fs from '@ohos.file.fs';
153   ```
154
1552. 创建音频选择选项实例。
156
157   ```ts
158   const audioSelectOptions = new picker.AudioSelectOptions();
159   ```
160
1613. 创建音频选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-6)接口拉起FilePicker界面进行文件选择。文件选择成功后,返回被选中音频的URI结果集。
162
163   </br>select返回的URI权限是只读权限,开发者可以根据结果集中URI做读取文件数据操作。注意不能在  picker的回调里直接使用此URI进行打开文件操作,需要定义一个全局变量保存URI,使用类似一个按钮去触发打开文件。
164
165   </br>例如通过[文件管理接口](../reference/apis/js-apis-file-fs.md)根据URI拿到音频资源的文件句柄(FD),再配合媒体服务实现音频播放的开发,具体请参考[音频播放开发指导](../media/audio-playback-overview.md)。
166
167   > **说明:**
168   >
169   > 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
170
171   ```ts
172   let URI = null;
173   const audioViewPicker = new picker.AudioViewPicker();
174   audioViewPicker.select(audioSelectOptions).then(audioSelectResult => {
175     URI = audioSelectOptions[0];
176     console.info('audioViewPicker.select to file succeed and URI is:' + URI);
177   }).catch((err) => {
178     console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
179   })
180   ```
181
1824. 待界面从FilePicker返回后,再通过类似一个按钮调用其他函数,使用[fs.openSync](../reference/apis/js-apis-file-fs.md#fsopensync)接口,通过URI打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY183
184   ```ts
185   let file = fs.openSync(URI, fs.OpenMode.READ_ONLY);
186   console.info('file fd: ' + file.fd);
187   ```
188
1895. 通过fd使用[fs.readSync](../reference/apis/js-apis-file-fs.md#readsync)接口读取这个文件内的数据,读取完成后关闭fd。
190
191   ```ts
192   let buffer = new ArrayBuffer(4096);
193   let readLen = fs.readSync(file.fd, buffer);
194   console.info('readSync data to file succeed and buffer size is:' + readLen);
195   fs.closeSync(file);
196   ```
197