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_ONLY。 52 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_ONLY。 130 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_ONLY。 183 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