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/10/15 13:49:08 阅读更多 →
C2000 eHRPWM寄存器配置实战:从时基到死区,驱动电机与电源设计

C2000 eHRPWM寄存器配置实战:从时基到死区,驱动电机与电源设计

1. 从寄存器手册到实战配置:eHRPWM的核心逻辑 如果你曾经在电机控制或者电源设计的项目中,面对德州仪器(TI)C2000系列微控制器那本厚厚的技术参考手册,对着eHRPWM(增强型高分辨率脉宽调制器)的寄…

2026/10/15 13:48:59 阅读更多 →
多线程断点续传下载器设计:从状态驱动到工程实践

多线程断点续传下载器设计:从状态驱动到工程实践

最近在准备面试,发现很多公司都喜欢问“设计一个支持多线程并发下载且能断点续传的文件下载器”。第一次看到这个题目,可能会觉得这不就是开几个线程,分几块数据,然后记一下进度吗?但真正动手去设计,尤其是…

2026/10/10 19:24:47 阅读更多 →

最新新闻

威利普LED-ECS免安版V5.3配置指南:从解压到屏体显示

威利普LED-ECS免安版V5.3配置指南:从解压到屏体显示

简介:威利普LED-ECS编辑控制系统V5.3免安版面向LED图文控制卡用户,提供一站式显示内容编辑与播放控制方案,适合广告公司、企业及个人快速搭建和维护LED屏。免安装特性显著,解压后即可运行,节省部署时间且减少系统感染风…

2026/10/15 13:50:26 阅读更多 →
FastAPI与SQLAlchemy多对多关系实战:从建表到添加记录的完整指南

FastAPI与SQLAlchemy多对多关系实战:从建表到添加记录的完整指南

FastAPI系列写到了第21篇,今天这篇聊一聊ORM里最容易被绕晕的一个环节——多对多关系的添加记录。有朋友留言说一对多关系还能勉强应付,一到多对多就不知道数据到底该往哪个表里塞,尤其是通过ORM操作时总报出各种莫名奇妙的错误。这篇文章我就…

2026/10/15 13:50:26 阅读更多 →
Windows Server 2012 R2 离线安装 .NET 3.5:SXS 源匹配与 DISM 实战

Windows Server 2012 R2 离线安装 .NET 3.5:SXS 源匹配与 DISM 实战

简介:这份资源是面向 Windows Server 2012 R2 系统管理员与运维人员的 .NET Framework 3.5 离线安装 SXS 文件包,用于解决服务器默认镜像未内置该框架、在无外网或带宽受限环境下无法通过服务器管理器直接启用 NetFX3 功能的问题。压缩包共收录 1568 个文…

2026/10/15 13:50:26 阅读更多 →
Obra Superpowers实战:用Java为团队打造统一的AI代码助手与自动化平台(含源码)

Obra Superpowers实战:用Java为团队打造统一的AI代码助手与自动化平台(含源码)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 13:50:26 阅读更多 →
电力电子技术课后答案避坑指南:从波形推导到Python验证

电力电子技术课后答案避坑指南:从波形推导到Python验证

简介:这份资源是《电力电子技术》第五版(王兆安、刘进军主编)的课后习题详细答案,面向正在学习该课程的本科生、备战考研或期末考试的考生,以及需要快速核对习题思路的自学者。内容覆盖电力电子器件、整流电路、PWM技术…

2026/10/15 13:50:26 阅读更多 →
openrig:Node.js+tmux搭建本地AI编码环境与多模型切换

openrig:Node.js+tmux搭建本地AI编码环境与多模型切换

1. 从“openrig”说起:一个被低估的本地AI编码环境搭建思路 第一次看到“openrig”这个词,我下意识地把它拆成了“open”和“rig”两部分。在开发者的语境里,“rig”通常指一套组装好的设备或环境配置,比如“mining rig”是矿机&a…

2026/10/15 13:49:24 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →