• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 选择用户文件
2
3用户需要分享文件、保存图片、视频等用户文件时,开发者可以通过系统预置的[文件选择器(FilePicker)](../reference/apis-core-file-kit/js-apis-file-picker.md),实现该能力。通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。picker获取的uri只具有临时权限,获取持久化权限需要通过[FilePicker设置永久授权](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)方式获取。
4
5根据用户文件的常见类型,选择器(FilePicker)分别提供以下选项:
6
7- [PhotoViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类型文件的选择与保存(该接口在后续版本不再演进)。请使用[PhotoAccessHelper的PhotoViewPicker](../media/medialibrary/photoAccessHelper-photoviewpicker.md)来选择图片文件。请使用[安全控件创建媒体资源](../media/medialibrary/photoAccessHelper-savebutton.md)。
8
9- [DocumentViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#documentviewpicker):适用于文件类型文件的选择与保存。DocumentViewPicker对接的选择资源来自于FilePicker, 负责文件类型的资源管理,文件类型不区分后缀,比如浏览器下载的图片、文档等,都属于文件类型。
10
11- [AudioViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#audioviewpicker):适用于音频类型文件的选择与保存。AudioViewPicker目前对接的选择资源来自于FilePicker。
12
13## 选择图片或视频类文件
14
15[PhotoViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#photoviewpicker)在后续版本不再演进,请使用[PhotoAccessHelper的PhotoViewPicker](../media/medialibrary/photoAccessHelper-photoviewpicker.md)来选择图片文件。
16
17## 选择文档类文件
18
191. 导入选择器模块和基础文件API模块。
20
21   ```ts
22   import  { picker } from '@kit.CoreFileKit';
23   import { fileIo as fs } from '@kit.CoreFileKit';
24   import { common } from '@kit.AbilityKit';
25   import { BusinessError } from '@kit.BasicServicesKit';
26   ```
27
282. 创建文件类型、文件选择选项实例。
29
30   ```ts
31   const documentSelectOptions = new picker.DocumentSelectOptions();
32   // 选择文档的最大数目(可选)
33   documentSelectOptions.maxSelectNumber = 5;
34   // 指定选择的文件或者目录路径(可选)
35   documentSelectOptions.defaultFilePathUri = "file://docs/storage/Users/currentUser/test";
36   // 选择文件的后缀类型['后缀类型描述|后缀类型'](可选) 若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100,选择所有文件:'所有文件(*.*)|.*';
37    documentSelectOptions.fileSuffixFilters = ['图片(.png, .jpg)|.png,.jpg', '文档|.txt', '视频|.mp4', '.pdf'];
38   //选择是否对指定文件或目录授权,true为授权,当为true时,defaultFilePathUri为必选参数,拉起文管授权界面;false为非授权,拉起常规文管界面(可选)
39   documentSelectOptions.authMode = true;
40   ```
41
423. 创建[文件选择器DocumentViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#documentviewpicker)实例。调用[select()](../reference/apis-core-file-kit/js-apis-file-picker.md#select-3)接口拉起FilePicker应用界面进行文件选择。
43
44   ```ts
45   let uris: Array<string> = [];
46   let context = getContext(this) as common.Context; // 请确保 getContext(this) 返回结果为 UIAbilityContext
47   // 创建文件选择器实例
48   const documentViewPicker = new picker.DocumentViewPicker(context);
49   documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
50     //文件选择成功后,返回被选中文档的uri结果集。
51     uris = documentSelectResult;
52     console.info('documentViewPicker.select to file succeed and uris are:' + uris);
53   }).catch((err: BusinessError) => {
54     console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
55   })
56   ```
57
58  > **注意:**
59  >
60  > **1**、使用picker获取的[select()](../reference/apis-core-file-kit/js-apis-file-picker.md#select-3)返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
61  > **2**、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。
62  > **3**、开发者可以根据结果集中uri做进一步的处理。建议定义一个全局变量保存uri。
63  > **4**、如有获取元数据需求,可以通过[基础文件API](../reference/apis-core-file-kit/js-apis-file-fs.md)和[文件URI](../reference/apis-core-file-kit/js-apis-file-fileuri.md)根据uri获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。
64
654. 待界面从FilePicker返回后,使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口通过uri打开这个文件得到文件描述符(fd)。
66
67   ```ts
68   let uri: string = '';
69   //这里需要注意接口权限参数是fs.OpenMode.READ_ONLY70   let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
71   console.info('file fd: ' + file.fd);
72   ```
73
745. 通过fd使用[fs.readSync](../reference/apis-core-file-kit/js-apis-file-fs.md#readsync)接口读取这个文件内的数据。
75
76   ```ts
77   let buffer = new ArrayBuffer(4096);
78   let readLen = fs.readSync(file.fd, buffer);
79   console.info('readSync data to file succeed and buffer size is:' + readLen);
80   //读取完成后关闭fd。
81   fs.closeSync(file);
82   ```
83
84## 选择音频类文件
85
861. 导入选择器模块和基础文件API模块。
87
88   ```ts
89   import  { picker } from '@kit.CoreFileKit';
90   import { fileIo as fs } from '@kit.CoreFileKit';
91   import { BusinessError } from '@kit.BasicServicesKit';
92   import { common } from '@kit.AbilityKit';
93   ```
94
952. 创建音频类型文件选择选项实例。
96
97   > **说明:**
98   >
99   > 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
100
101   ```ts
102   const audioSelectOptions = new picker.AudioSelectOptions();
103   ```
104
1053. 创建[音频选择器AudioViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#audioviewpicker)实例。调用[select()](../reference/apis-core-file-kit/js-apis-file-picker.md#select-5)接口拉起FilePicker应用界面进行文件选择。
106   ```ts
107   let uris: string = '';
108   // 请确保 getContext(this) 返回结果为 UIAbilityContext
109   let context = getContext(this) as common.Context;
110   const audioViewPicker = new picker.AudioViewPicker(context);
111   audioViewPicker.select(audioSelectOptions).then((audioSelectResult: Array<string>) => {
112     //文件选择成功后,返回被选中音频的uri结果集。
113     uris = audioSelectResult[0];
114     console.info('audioViewPicker.select to file succeed and uri is:' + uris);
115   }).catch((err: BusinessError) => {
116     console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
117   })
118   ```
119
120  > **注意:**
121  >
122  > **1**、使用picker获取的[select()](../reference/apis-core-file-kit/js-apis-file-picker.md#select-3)返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
123  > **2**、如果想要获取持久化权限(仅在2in1设备上生效),请参考[文件持久化授权访问](file-persistPermission.md#通过picker获取临时授权并进行授权持久化)。
124  > **3**、开发者可以根据结果集中的uri做读取文件数据操作。建议定义一个全局变量保存uri。例如通过[基础文件API](../reference/apis-core-file-kit/js-apis-file-fs.md)根据uri拿到音频资源的文件描述符(fd),再配合媒体服务实现音频播放的开发,具体请参考[音频播放开发指导](../media/audio/audio-playback-overview.md)。
125
1264. 待界面从FilePicker返回后,可以使用[基础文件API的fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接口通过uri打开这个文件得到文件描述符(fd)。
127
128   ```ts
129   let uri: string = '';
130   //这里需要注意接口权限参数是fs.OpenMode.READ_ONLY131   let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
132   console.info('file fd: ' + file.fd);
133   ```
134
1355. 通过fd可以使用[基础文件API的fs.readSync](../reference/apis-core-file-kit/js-apis-file-fs.md#readsync)接口读取这个文件内的数据。
136
137   ```ts
138   let buffer = new ArrayBuffer(4096);
139   let readLen = fs.readSync(file.fd, buffer);
140   console.info('readSync data to file succeed and buffer size is:' + readLen);
141   //读取完成后关闭fd。
142   fs.closeSync(file);
143   ```
144
145## 相关实例
146
147针对用户文件的选择,有以下相关实例可供参考:
148
149- [选择并查看文档与媒体文件(ArkTS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-4.0-Release/code/BasicFeature/FileManagement/FileShare/Picker)
150
151<!--RP1--><!--RP1End-->