HarmonyOS掌上记账APP开发实践第50篇:Core File Kit 与文件选择器:沙箱文件管理与批量授权
050 — Core File Kit 与文件选择器沙箱文件管理与批量授权简介鸿蒙系统采用沙箱文件机制来保障用户数据安全——每个应用只能访问自己的沙箱目录访问外部文件需要通过文件选择器Picker获取用户授权。MoneyTrack 在反馈模块中完整实践了这一流程用户通过 Picker 选择图片或文件系统返回 URI 后应用通过fileUri.getUriFromPath()完成路径转换再读取文件内容进行上传。批量授权机制让用户可以一次选择多个文件并统一授权避免了逐个确认的繁琐操作。核心知识点1. 沙箱文件目录结构鸿蒙应用的沙箱路径遵循以下目录结构/data/storage/el2/base/haps/entry/files/ ← 应用文件目录 /data/storage/el2/base/haps/entry/cache/ ← 缓存目录系统可清理 /data/storage/el2/base/data/ ← 应用数据库和 SharedPreferences /data/storage/el2/base/preferences/ ← 首选项存储目录沙箱分为两个层级应用沙箱应用私有目录无需授权即可读写但数据随应用卸载而删除。用户沙箱用户公开目录如相册、下载需要通过 Picker 授权访问。2. fileUri URI 转换fileUri模块提供沙箱路径与 URI 的相互转换fileUri.getUriFromPath(path)将本地沙箱路径转换为file://协议 URI。fileUri.getPathFromUri(uri)将 URI 转换回本地路径。URI 格式的跨进程传递更为安全和标准。3. 文件选择器PickerPicker 是系统提供的标准文件选择界面核心 Picker 类型如下Picker 类型适用场景核心参数PhotoViewPicker图片/视频选择maxCount, selectTypeDocumentViewPicker文档选择PDF/Word/ExcelmaxCount, fileSuffixFiltersAudioViewPicker音频文件选择maxCountPhotoViewPicker 完整参数说明参数类型说明示例maxCountnumber最大选择数量默认 109selectTypePhotoSelectType筛选类型IMAGE、VIDEO、IMAGE_VIDEOIMAGEDocumentViewPicker用于选择文档文件支持按文件后缀筛选constdocPickernewDocumentViewPicker();constresultawaitdocPicker.select({maxCount:5,fileSuffixFilters:[.pdf,.doc,.docx]});// result 返回选中文件的 URI 列表4. PersistableURI 持久化授权Picker 返回的 URI 默认是临时授权——应用在前台运行时有效。如果需要后台或下次启动时继续访问需要通过PersistableURI机制持久化授权。持久化后应用在后续启动时无需用户再次授权即可访问这些文件。5. 文件选择→授权→URI转换→读取→上传完整流程渲染错误:Mermaid 渲染失败: Parse error on line 2: graph TD A[用户点击选择文件] -- B[调用 Pick -------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got STR项目代码案例反馈模块中的上传文件处理文件路径feature_feedback组件import{photoAccessHelper}fromkit.MediaLibraryKit;import{fileUri}fromkit.CoreFileKit;import{fileIoasfs}fromkit.CoreFileKit;asyncfunctionpickAndUpload(){// 打开 Picker 选择图片constpickernewphotoAccessHelper.PhotoViewPicker();constresultawaitpicker.select({maxCount:9,// 最多选择 9 张selectType:photoAccessHelper.PhotoSelectType.IMAGE// 仅图片});for(consturiofresult.photoUris){// URI 转路径constpathfileUri.getPathFromUri(uri);// 读取文件并上传awaituploadFile(uri,path);}}asyncfunctionuploadFile(uri:string,path:string){// 使用 fs 打开文件读取内容constfilefs.openSync(path,fs.OpenMode.READ_ONLY);constbuffernewArrayBuffer(4096);fs.readSync(file.fd,buffer);fs.closeSync(file);// 通过 FormData 上传constformDatanewFormData();formData.append(file,uri);returnaxios.post(/api/feedback/upload,formData,{headers:{Content-Type:multipart/form-data}});}// 持久化授权的示例asyncfunctionpersistFileAccess(uris:string[]){constpersistentUrinewPersistableURI(uris[0]);awaitpersistentUri.persist();// 持久化授权console.info(文件访问权限已持久化);}使用 DocumentViewPicker 选择文档import{DocumentViewPicker}fromkit.CoreFileKit;asyncfunctionpickDocument(){constdocPickernewDocumentViewPicker();constresultawaitdocPicker.select({maxCount:3,fileSuffixFilters:[.pdf,.xlsx,.docx]});if(resultresult.length0){for(constdocUriofresult){constpathfileUri.getPathFromUri(docUri);// 处理文件...}}}最佳实践合理设置 maxCount根据业务需求设置最大选择数量图片上传建议 9 张以内文档选择建议 5 张以内避免一次性选择过多文件导致内存溢出。使用 selectType 过滤明确指定selectType让用户在 Picker 中只看到需要的文件类型提升选择效率。及时释放文件资源使用fs.openSync后务必在 finally 中调用fs.closeSync避免文件句柄泄漏。临时授权 vs 持久化授权大多数上传场景使用临时授权即可只有需要跨应用启动周期访问的场景如下载目录中的文件才需要 PersistableURI。URI 优先于路径传递URI 是跨进程传递的标准格式优先使用 URI 而非拼接后的路径确保兼容性和安全性。错误处理Picker 可能被用户取消返回 null或文件被删除读取失败务必做好错误处理并给出用户友好的提示。推荐参考文档Core File Kit 文件管理指南PhotoViewPicker / DocumentViewPicker API 参考PersistableURI API 参考

相关新闻

HarmonyOS掌上记账APP开发实践第49篇:App Linking Kit 应用链接:延迟拉起与深度链接场景

HarmonyOS掌上记账APP开发实践第49篇:App Linking Kit 应用链接:延迟拉起与深度链接场景

049 — App Linking Kit 应用链接:延迟拉起与深度链接场景 简介 在用户拉新和回流场景中,如何让用户从外部链接直接跳转到应用内的特定页面是关键体验。App Linking Kit 提供了强大的深度链接能力,支持"延迟拉起"——即使用户尚未…

2026/7/21 8:49:16阅读更多 →
深入解析TMS320F2803x DSP时钟系统:从PLL配置到故障处理

深入解析TMS320F2803x DSP时钟系统:从PLL配置到故障处理

1. 项目概述与核心价值 对于任何一位从事TMS320F2803x系列DSP开发的工程师来说,时钟系统的配置绝对是项目启动时绕不开的第一个“硬骨头”。你可能有过这样的经历:代码下载进去,外设就是不工作,或者PWM输出频率飘忽不定&#xff0…

2026/7/21 8:47:15阅读更多 →
AI应用权限设计为何不能照搬原有业务系统

AI应用权限设计为何不能照搬原有业务系统

企业做AI应用定制时,权限设计往往被当作一个“已有功能”处理——业务系统已经有RBAC角色权限,AI应用接入时照搬即可。一个客服Agent同时连接了订单系统和财务系统,传统RBAC可以控制某个角色能否访问这两个系统,但无法控制Agent在…

2026/7/21 8:47:15阅读更多 →
PHP 8.5容器化实战:从基础镜像到生产部署

PHP 8.5容器化实战:从基础镜像到生产部署

1. PHP 8.5容器化实战指南作为现代Web开发的核心语言之一,PHP在容器化浪潮中展现出强大的适应能力。将PHP 8.5应用容器化不仅能实现环境标准化,还能显著提升部署效率和资源利用率。本指南将从实际生产经验出发,详解PHP容器化的完整技术路径。…

2026/7/21 22:30:42阅读更多 →
嵌入式系统PLL控制器配置:从寄存器解析到实战调试

嵌入式系统PLL控制器配置:从寄存器解析到实战调试

1. 锁相环(PLL)控制器:嵌入式系统的“心脏起搏器”在任何一个复杂的嵌入式系统里,时钟信号就像是整个系统的脉搏,它决定了处理器、总线和外设协同工作的节奏。而锁相环(PLL)控制器,就…

2026/7/21 22:30:42阅读更多 →
Android功耗系列专题理论之三:cpu 功耗问题分析方法

Android功耗系列专题理论之三:cpu 功耗问题分析方法

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: Android功耗系列专题理论之三:cpu 功耗问题分析方法 目录 一、背景 1.1:CPU 电源管理简介 1.2:cpufreq框架 1.3:schedutil框架 1.4:cpu idle

2026/7/21 22:30:42阅读更多 →
深入解析McBSP仿真模式与复位机制:嵌入式DSP通信调试与配置实战

深入解析McBSP仿真模式与复位机制:嵌入式DSP通信调试与配置实战

1. McBSP仿真模式、复位机制与寄存器详解在嵌入式DSP开发中,尤其是使用TI的TMS320系列芯片时,多通道缓冲串行端口(McBSP)是一个功能强大且复杂的模块。它不仅是连接音频编解码器、ADC/DAC、数字传感器等外部器件的桥梁&#xff0c…

2026/7/21 22:30:42阅读更多 →
2026河南高考一分一段表解析与志愿填报指南

2026河南高考一分一段表解析与志愿填报指南

1. 高考分数段统计表的本质与价值每年高考结束后,各省教育考试院都会发布"一分一段表",这本质上是一份考生成绩分布统计报告。以河南这样的高考大省为例,2026年的一分一段表将清晰呈现全省考生在各分数区间的具体人数分布情况。这份…

2026/7/21 22:30:42阅读更多 →
QSS终极指南:9款专业QT样式表模板快速美化你的应用界面

QSS终极指南:9款专业QT样式表模板快速美化你的应用界面

QSS终极指南:9款专业QT样式表模板快速美化你的应用界面 【免费下载链接】QSS QT Style Sheets templates 项目地址: https://gitcode.com/gh_mirrors/qs/QSS 想要让你的Qt应用拥有专业级的视觉效果吗?QSS项目为你提供了完整的解决方案。这个开源样…

2026/7/21 22:28:42阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →