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

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

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

2026/9/9 22:40:06 阅读更多 →
多线程断点续传下载器设计:从状态驱动到工程实践

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

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

2026/9/12 18:48:57 阅读更多 →

最新新闻

arduino-esp32 USB API 完全指南:在 ESP32-S2/S3 上使用 TinyUSB 实现设备与主机模式

arduino-esp32 USB API 完全指南:在 ESP32-S2/S3 上使用 TinyUSB 实现设备与主机模式

arduino-esp32 USB API 完全指南:在 ESP32-S2/S3 上使用 TinyUSB 实现设备与主机模式 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 导读 本文围绕 arduino-…

2026/9/13 20:01:26 阅读更多 →
Figma 变量创建指南:从源 Token 数据到语义化变量体系的建模与落地(基于 figma-use Skill 实践)

Figma 变量创建指南:从源 Token 数据到语义化变量体系的建模与落地(基于 figma-use Skill 实践)

Figma 变量创建指南:从源 Token 数据到语义化变量体系的建模与落地(基于 figma-use Skill 实践) 【免费下载链接】skills Skills Catalog for Codex 项目地址: https://gitcode.com/GitHub_Trending/skills4/skills 本篇指南聚焦于「如…

2026/9/13 20:01:26 阅读更多 →
CAN自定义协议设计实战:从ID规划到量产落地

CAN自定义协议设计实战:从ID规划到量产落地

1. 为什么“CAN自定义协议”不是写个ID和数据就完事——从汽车ECU通信现场说起我第一次在整车厂做CAN通信调试时,被一个看似简单的“灯光控制报文”卡了整整三天。客户要求用标准帧ID 0x123发送4字节数据:前两字节控制近光灯/远光灯开关,后两…

2026/9/13 20:01:26 阅读更多 →
STM32F103+EC800-4G裸机实现GNSS定位与ONENET直传

STM32F103+EC800-4G裸机实现GNSS定位与ONENET直传

简介:本资源是一套面向嵌入式物联网开发者的STM32F103单片机实战项目例程,聚焦于GNSS定位与多传感器数据采集、4G远程通信及云平台双向交互,适用于高校电子类课程设计、毕业设计及工程师快速原型开发。压缩包共245个文件,含40余个…

2026/9/13 20:01:26 阅读更多 →
RemoveWindowsAI:一键彻底清除 Windows 11 的 Copilot 和 Recall

RemoveWindowsAI:一键彻底清除 Windows 11 的 Copilot 和 Recall

RemoveWindowsAI:一键彻底清除 Windows 11 的 Copilot 和 Recall 【免费下载链接】RemoveWindowsAI Force Remove Copilot, Recall and More in Windows 11 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI RemoveWindowsAI 是一个 Power…

2026/9/13 20:01:26 阅读更多 →
ToolJet Workspace Variables 迁移到 Workspace Constants 完整指南

ToolJet Workspace Variables 迁移到 Workspace Constants 完整指南

ToolJet Workspace Variables 迁移到 Workspace Constants 完整指南 【免费下载链接】ToolJet Open-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visu…

2026/9/13 20:00:25 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →