鸿蒙next开发:选择用户文件_鸿蒙开发 拉取文件
往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
-
鸿蒙开发核心知识点,看这篇文章就够了
-
最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
-
鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
-
鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)
选择用户文件
用户需要分享文件、保存图片、视频等用户文件时,开发者可以通过系统预置的文件选择器(FilePicker),实现该能力。通过Picker访问相关文件,将拉起对应的应用,引导用户完成界面操作,接口本身无需申请权限。Picker获取的URI只具有临时权限,获取持久化权限需要通过FilePicker设置永久授权方式获取。
根据用户文件的常见类型,选择器(FilePicker)分别提供以下选项:
-
PhotoViewPicker:适用于图片或视频类型文件的选择与保存(该接口在后续版本不再演进)。请使用PhotoAccessHelper的PhotoViewPicker来选择图片文件。
-
DocumentViewPicker:适用于文件类型文件的选择与保存。DocumentViewPicker对接的选择资源来自于FilePicker,负责文件类型的资源管理,文件类型不区分后缀,比如浏览器下载的图片、文档等,都属于文件类型。
-
AudioViewPicker:适用于音频类型文件的选择与保存。AudioViewPicker目前对接的选择资源来自于FilePicker。
选择图片或视频类文件
PhotoViewPicker在后续版本不再演进,请PhotoAccessHelper的PhotoViewPicker来选择图片文件。
选择文档类文件
-
导入选择器模块和基础文件API模块。
import { picker } from \'@kit.CoreFileKit\';import { fileIo as fs } from \'@kit.CoreFileKit\';import { common } from \'@kit.AbilityKit\';import { BusinessError } from \'@kit.BasicServicesKit\';
-
创建文件类型、文件选择选项实例。
const documentSelectOptions = new picker.DocumentSelectOptions();// 选择文档的最大数目(可选)。documentSelectOptions.maxSelectNumber = 5;// 指定选择的文件或者目录路径(可选)。documentSelectOptions.defaultFilePathUri = \"file://docs/storage/Users/currentUser/test\";// 选择文件的后缀类型[\'后缀类型描述|后缀类型\'](可选,不传该参数,默认不过滤,即显示所有文件),若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100。此外2in1设备支持通过通配符方式[\'所有文件(*.*)|.*\'],表示为显示所有文件,手机暂不支持该配置。 documentSelectOptions.fileSuffixFilters = [\'图片(.png, .jpg)|.png,.jpg\', \'文档|.txt\', \'视频|.mp4\', \'.pdf\']; //选择是否对指定文件或目录授权,true为授权,当为true时,defaultFilePathUri为必选参数,拉起文管授权界面;false为非授权(默认为false),拉起常规文管界面(可选),仅支持2in1设备。documentSelectOptions.authMode = false;//批量授权模式,默认为false(非批量授权模式)。当multAuthMode为true时为批量授权模式。当multAuthMode为true时,只有multiUriArray参数生效,其他参数不生效。仅支持手机设备。documentSelectOptions.multiAuthMode = false;//需要传入批量授权的uri数组(仅支持文件,文件夹不生效)。配合multAuthMode使用。当multAuthMode为false时,配置该参数不生效。仅支持手机设备。documentSelectOptions.multiUriArray = [\"file://docs/storage/Users/currentUser/test\", \"file://docs/storage/Users/currentUser/2test\"];//开启聚合视图模式,支持拉起文件管理应用的聚合视图。默认为DEFAULT,表示该参数不生效,非聚合视图。当该参数置为非DEFAULT时,其他参数不生效。仅支持手机设备。documentSelectOptions.mergeMode = picker.MergeTypeMode.DEFAULT;
-
创建文件选择器DocumentViewPicker实例。调用select()接口拉起FilePicker应用界面进行文件选择。
let uris: Array = [];let context = getContext(this) as common.Context; // 请确保 getContext(this) 返回结果为 UIAbilityContext// 创建文件选择器实例const documentViewPicker = new picker.DocumentViewPicker(context);documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array) => { //文件选择成功后,返回被选中文档的URI结果集。 uris = documentSelectResult; console.info(\'documentViewPicker.select to file succeed and uris are:\' + uris);}).catch((err: BusinessError) => { console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);})
注意
1、使用Picker获取的select()返回的URI权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
2、如果想要获取持久化权限。
3、开发者可以根据结果集中URI做进一步的处理。建议定义一个全局变量保存URI。
4、如有获取元数据需求,可以通过基础文件API和文件URI根据URI获取部分文件属性信息,比如文件大小、访问时间、修改时间、文件名、文件路径等。
-
待界面从FilePicker返回后,使用基础文件API的fs.openSync接口通过URI打开这个文件得到文件描述符(fd)。
let uri: string = \'\';//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);console.info(\'file fd: \' + file.fd);
-
通过fd使用fs.readSync接口读取这个文件内的数据。
let buffer = new ArrayBuffer(4096);let readLen = fs.readSync(file.fd, buffer);console.info(\'readSync data to file succeed and buffer size is:\' + readLen);//读取完成后关闭fd。fs.closeSync(file);
选择音频类文件
-
导入选择器模块和基础文件API模块。
import { picker } from \'@kit.CoreFileKit\';import { fileIo as fs } from \'@kit.CoreFileKit\';import { BusinessError } from \'@kit.BasicServicesKit\';import { common } from \'@kit.AbilityKit\';
-
创建音频类型文件选择选项实例。
说明
目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
const audioSelectOptions = new picker.AudioSelectOptions();
-
创建音频选择器AudioViewPicker实例。调用select()接口拉起FilePicker应用界面进行文件选择。
let uris: string = \'\';// 请确保 getContext(this) 返回结果为 UIAbilityContextlet context = getContext(this) as common.Context; const audioViewPicker = new picker.AudioViewPicker(context);audioViewPicker.select(audioSelectOptions).then((audioSelectResult: Array) => { //文件选择成功后,返回被选中音频的URI结果集。 uris = audioSelectResult[0]; console.info(\'audioViewPicker.select to file succeed and uri is:\' + uris);}).catch((err: BusinessError) => { console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);})
注意
1、使用Picker获取的select()返回的URI权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
2、如果想要获取持久化权限。
3、开发者可以根据结果集中的URI做读取文件数据操作。建议定义一个全局变量保存URI。例如通过基础文件API根据URI拿到音频资源的文件描述符(fd),再配合媒体服务实现音频播放的开发。
-
待界面从FilePicker返回后,可以使用基础文件API的fs.openSync接口通过URI打开这个文件得到文件描述符(fd)。
let uri: string = \'\';//这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);console.info(\'file fd: \' + file.fd);
-
通过fd可以使用基础文件API的fs.readSync接口读取这个文件内的数据。
let buffer = new ArrayBuffer(4096);let readLen = fs.readSync(file.fd, buffer);console.info(\'readSync data to file succeed and buffer size is:\' + readLen);//读取完成后关闭fd。fs.closeSync(file);