HarmonyOS运动开发:深度解析文件预览的正确姿势
鸿蒙核心技术##运动开发##Core File Kit(文件基础服务)##Preview Kit(文件预览服务)#

在 HarmonyOS 开发中,文件预览功能是一个常见的需求,尤其是在处理用户上传的图片、文档、音频或视频等资源时。然而,实现文件预览并非一帆风顺,尤其是在涉及文件权限和预览窗口管理时。本文将以“选择好的文件进行预览”为主题,深入解析 HarmonyOS 中文件预览的核心要点,并分享一些实际开发中的经验技巧,帮助开发者避免常见的坑。
前言:文件预览的痛点与挑战
在 HarmonyOS 中,文件预览功能看似简单,实则暗藏诸多细节。开发者常常会遇到诸如文件权限不足、预览窗口无法正常打开或重复打开等问题。这些问题不仅影响用户体验,还可能导致应用崩溃或数据丢失。因此,掌握正确的文件预览实现方式至关重要。
核心要点:文件 URI 权限持久化
在 HarmonyOS 中,通过DocumentViewPicker拿到的文件 URI 仅具有临时权限,这种权限无法直接用于文件预览,否则会导致预览失败。因此,我们需要对文件 URI 进行持久化权限处理。
权限持久化代码解析
await fileShare.persistPermission([
{
uri: uri,
operationMode: fileShare.OperationMode.READ_MODE
}
]);
• fileShare.persistPermission:这是关键的持久化方法,它将文件 URI 的权限从临时变为持久,确保预览功能能够正常访问文件。
• uri:这是文件的路径,需要确保其格式正确。
• operationMode:这里指定为READ_MODE,表示仅授予读取权限,这是预览功能所需要的最低权限。
此外,为了使用persistPermission方法,还需要在应用的config.json文件中声明以下权限:
{
"name": "ohos.permission.FILE_ACCESS_PERSIST"
}
获取文件 MIME 类型
在预览文件之前,我们需要明确文件的 MIME 类型,这对于预览功能的正确性至关重要。以下是获取 MIME 类型的代码实现:
private getMimeType(filePath: string): string {
const extension = filePath.split('.').pop()?.toLowerCase() || '';
switch (extension) {
case 'jpg':
case 'jpeg':
return 'image/jpeg';
case 'png':
return 'image/png';
case 'gif':
return 'image/gif';
case 'bmp':
return 'image/bmp';
case 'webp':
return 'image/webp';
case 'mp4':
return 'video/mp4';
case 'mov':
return 'video/quicktime';
case 'avi':
return 'video/x-msvideo';
case 'mp3':
return 'audio/mpeg';
case 'wav':
return 'audio/wav';
case 'ogg':
return 'audio/ogg';
case 'txt':
case 'log':
return 'text/plain';
case 'html':
case 'htm':
return 'text/html';
default:
return 'application/octet-stream';
}
}
代码解析
• filePath.split('.').pop():通过文件路径获取文件扩展名,这是判断 MIME 类型的关键。
• switch语句:根据扩展名返回对应的 MIME 类型。这里涵盖了常见的图片、视频、音频、文本和 HTML 文件类型。
• 默认值:如果文件类型无法识别,则返回application/octet-stream,这是一种通用的二进制流类型。
预览文件的实现细节
预览文件的实现涉及多个步骤,包括检查文件是否存在、是否可预览、准备预览参数以及管理预览窗口。以下是完整的代码实现:
async previewFile(): Promise<void> {
if (!this.selectedFilePath) {
promptAction.showToast({ message: '请先选择文件', duration: 2000 });
return;
}
try {
let uiContext = this.getUIContext().getHostContext() as Context;
// 1. 检查文件是否存在
try {
await fs.access(this.selectedFilePath);
} catch {
promptAction.showToast({ message: '文件不存在或不可访问', duration: 2000 });
return;
}
// 2. 检查是否可预览
const uri = this.selectedFilePath.startsWith('file://') ?
this.selectedFilePath :
`file://${this.selectedFilePath}`;
await fileShare.persistPermission([
{
uri: uri,
operationMode: fileShare.OperationMode.READ_MODE
}
]);
const canPreview = await filePreview.canPreview(uiContext, uri);
if (!canPreview) {
promptAction.showToast({ message: '不支持预览此文件类型', duration: 2000 });
return;
}
// 3. 准备预览参数
const fileInfo: filePreview.PreviewInfo = {
title: this.fileName,
uri: uri,
mimeType: this.getMimeType(this.selectedFilePath)
};
// 4. 检查是否已有预览窗口
const hasDisplayed = await filePreview.hasDisplayed(uiContext);
if (hasDisplayed) {
// 已有窗口则关闭
await filePreview.closePreview(uiContext)
} else {
// 新开预览窗口
const displayInfo: filePreview.DisplayInfo = {
x: 100, // 窗口起始x坐标
y: 100, // 窗口起始y坐标
width: 800, // 窗口宽度
height: 800 // 窗口高度
};
await filePreview.openPreview(uiContext, fileInfo, displayInfo);
}
console.info('文件预览成功');
} catch (err) {
const error = err as BusinessError;
console.error(`预览失败,错误码: ${error.code}, 错误信息: ${error.message}`);
promptAction.showToast({
message: `预览失败: ${error.message}`,
duration: 2000
});
}
}
代码解析
• 检查文件是否存在:通过fs.access方法检查文件路径是否有效。
• 持久化文件权限:使用fileShare.persistPermission方法确保文件 URI 具有持久化读取权限。
• 检查是否可预览:调用filePreview.canPreview方法判断文件类型是否支持预览。
• 准备预览参数:构建filePreview.PreviewInfo对象,包含文件标题、URI 和 MIME 类型。
• 管理预览窗口:通过filePreview.hasDisplayed检查是否已有预览窗口。如果存在,则调用filePreview.closePreview关闭窗口;如果不存在,则调用filePreview.openPreview新开预览窗口。
总结:文件预览的正确实现之道
在 HarmonyOS 开发中,实现文件预览功能需要关注文件权限、MIME 类型获取以及预览窗口管理等多个方面。
HarmonyOS运动开发:深度解析文件预览的正确姿势的更多相关文章
- 手把手教你用 Spring Boot搭建一个在线文件预览系统!支持ppt、doc等多种类型文件预览
昨晚搭建环境都花了好一会时间,主要在浪费在了安装 openoffice 这个依赖环境上(Mac 需要手动安装). 然后,又一步一步功能演示,记录,调试项目,并且简单研究了一下核心代码之后才把这篇文章写 ...
- COS控制台进阶 - 文件预览和在线编辑
导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...
- 李洪强iOS开发之苹果使用预览截图
李洪强iOS开发之苹果使用预览截图 01 在预览的图片中选中你要截得区域 02 - command + C 03 - Command + N 04 - Command + S (保存)
- java实现office文件预览
不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能. 相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事.大家请 ...
- Qt SD卡 文件系统挂载、文件预览
/********************************************************************************** * Qt SD卡 文件系统挂载. ...
- Jquery.Treeview+Jquery UI制作Web文件预览
效果图: 前台Html: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="D ...
- Vue PDF文件预览vue-pdf
最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...
- 关于pc端 app端pdf,word xls等文件预览的功能
第一种用H5标签<iframe>标签实现 返回的文件类型,文件流,文件流返回必须在设置 contentType对应的Mime Type, 返回文件的物理位置. 已经实测可以支持的文件类型 ...
- odoo13之文件预览widget/模块
本文示例代码可查看github仓库:odoo13_file_preview 文件预览效果图展示 效果描述: 1.当点击图片或者文件时展开图片. 2.当点击关闭按钮时关闭图片预览. 3.当点击下载按钮时 ...
- java 文件转成pdf文件 预览
一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...
随机推荐
- celery 启动显示警告信息“...whether broker connection retries are made during startup in Celery 6.0 and above...”
博客地址:https://www.cnblogs.com/zylyehuo/ # celery作为一个单独项目运行,在settings文件中设置 broker_connection_retry_on_ ...
- SpringBoot+微信支付-JSAPI{微信支付回调}
引入微信支付SDK Maven: com.github.wechatpay-apiv3:wechatpay-java-core:0.2.12 Maven: com.github.wechatpay-a ...
- Linux reboot全过程
一.版本说明嵌入式Linux 下面的reboot命令看似简单,但出问题时定位起来发现别有洞天.下面就按在shell下执行reboot命令之后程序的执行过程进行解析.Busybox:1.23.2 ...
- ORA-01779: cannot modify a column which maps to a non-key-preserved table
Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误.该错误的内容为: ORA-01779: cannot modify a column which maps to a non- ...
- dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
看随机的报表DEMO,主从表也好,数据分组也好.呈现的非常到位. 问题:可是自己在实现数据分组时,一旦设定分组字段就出现了混乱的数据记录. 问题的原因: 看一下一个报表页面设计时需要理清的概念. 页头 ...
- .net WorkFlow 流程传阅
WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...
- C#(如何解决使用enum和struct作为Dictionary的TKey带来的GC
- Vue的前端项目开发环境搭建
一.本机window端:安装Node.js,其实质性功能相当于,java的maven https://nodejs.org/en/download/ 二.本机window端:检查Node.js的版本 ...
- 康谋技术 |高效同步与处理:ADTF流服务在自动驾驶数采中的应用
随着自动驾驶技术的发展,车辆的智能化程度不断提高,这体现了车辆感知,决策以及执行的能力.在算法开发和迭代过程中,提高测试和开发效率,关键在于多传感器数据的高质量采集,确保数据的同步性.完整性和一致性. ...
- dbeaver导入sql脚本报错的排查—— ERROR 1366 (HY000) at line
描述 在使用dbeaver进行sql脚本导入的时候报了以下的错误. C:\Users\xxxx\AppData\Roaming\DBeaverData\drivers\clients\mysql_8\ ...