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_ONLY。 62 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_ONLY。 125 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_ONLY。 187 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)