HarmonyOS 鸿蒙Next中FilePreview使用
HarmonyOS 鸿蒙Next中FilePreview使用 在HarmonyOS应用开发中,经常需要实现各种文件的预览功能,包括:
- 本地存储的文件预览。
- 应用资源目录(rawfile)中的文件预览。
- 网络文件的下载与预览。
如何利用HarmonyOS提供的FilePreview服务统一实现这些不同来源文件的预览?
HarmoneyOS提供了FilePreview框架,这是一个用于文件预览的统一接口服务。它支持多种文件格式的预览,包括但不限于:
- 文档类:pdf、doc、docx、ppt、pptx、xls、xlsx等。
- 图片类:jpg、png、gif等。
- 音频类:m4a、aac、mp3、ogg、wav等。
- 视频类:mp4、mkv、ts等。
- 其他常见格式。
FilePreview服务的主要优势在于:
- 统一的API接口。
- 支持多种文件来源。
- 内置多种文件格式解析能力。
解决方案
- 本地文件指存储在应用沙箱目录或公共目录中的文件,该类文件的预览可以参考官方文档:本地文件预览。
previewLocalFile() {
try {
const filePath = `${this.context.filesDir}/sample.pdf`;
// 检查文件是否存在
const isExist = fs.accessSync(filePath);
if (!isExist) {
console.error('本地文件不存在,请确保文件已放置到应用目录');
return;
}
// 构建PreviewInfo
let uri = fileUri.getUriFromPath(filePath);
let fileInfo: filePreview.PreviewInfo = {
title: 'sample.pdf',
uri: uri,
mimeType: 'application/pdf',
};
// 打开文件预览
filePreview.openPreview(this.context, fileInfo).then(() => {
console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});
} catch (error) {
console.error(`预览rawfile文件失败: ${JSON.stringify(error)}`);
}
}
- rawfile文件预览,当前API不支持直接预览rawFile文件,预览时需要先将rawfile导入至沙箱路径。
previewRawFile() {
try {
// 预览rawfile文件,需要将文件复制到沙箱目录
let filePath = `${this.context.filesDir}/sample.pdf`;
const resourceMgr = this.context.resourceManager;
resourceMgr.getRawFileContent('sample.pdf', (err, value) => {
let myBuffer: ArrayBufferLike = value.buffer;
// 创建sample.pdf沙箱路径,并写入数据
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, myBuffer);
fs.close(file);
});
let uri = fileUri.getUriFromPath(filePath);
let fileInfo: filePreview.PreviewInfo = {
title: 'sample.pdf',
uri: uri,
mimeType: 'application/pdf',
};
// 打开文件预览
filePreview.openPreview(this.context, fileInfo).then(() => {
console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});
} catch (error) {
console.error(`预览rawfile文件失败: ${JSON.stringify(error)}`);
}
}
- 网络文件预览,与rawfile文件相同,文件预览服务FilePreview暂不支持在线预览,对于网络文件需要下载到本地之后进行本地文件预览。
previewNetworkFile() {
// url需替换为实际可用的pdf url
const url = 'https://****.com/test.pdf';
let filePath = `${this.context.filesDir}/sample.pdf`;
try {
// 网络文件下载到本地
let res = fs.accessSync(filePath);
if (res) {
// 本地文件存在,则直接调用预览方法
console.info('file exists and ViewFile');
let uri = fileUri.getUriFromPath(filePath);
let fileInfo: filePreview.PreviewInfo = {
title: 'sample.pdf',
uri: uri,
mimeType: 'application/pdf',
};
// 打开文件预览
filePreview.openPreview(this.context, fileInfo).then(() => {
console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});
} else {
// 文件下载到本地
request.downloadFile(this.context, {
url: url,
filePath: filePath
}).then((downloadTask: request.DownloadTask) => {
// 下载完成回调
downloadTask.on('complete', () => {
console.info('download complete');
let uri = fileUri.getUriFromPath(filePath);
let fileInfo: filePreview.PreviewInfo = {
title: 'sample.pdf',
uri: uri,
mimeType: 'application/pdf',
};
// 打开文件预览
filePreview.openPreview(this.context, fileInfo).then(() => {
console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});
});
}).catch((err: BusinessError) => {
console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
});
}
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
}
}
总结
文件预览服务为文件预览提供了统一的解决方案:
统一接口:无论文件来源如何,都使用filepreview.openPreview()接口。
格式丰富:支持常见办公文档、图片、文本等格式。
权限管理:需要确保应用有相应文件的访问权限。
实际开发中应根据具体场景选择合适的预览方式,并处理好错误情况和用户权限问题。对于敏感文件,还应该增加额外的安全验证机制。
更多关于HarmonyOS 鸿蒙Next中FilePreview使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,FilePreview组件用于文件预览功能。它支持多种文件格式,包括图片、文档等,通过FilePreviewController进行控制。开发者可配置预览参数,如缩放比例和页面切换。该组件直接集成在ArkUI框架中,无需依赖Java或C语言。使用示例:在Page中引入组件,绑定控制器,设置文件路径即可实现预览。
在HarmonyOS Next中,FilePreview服务通过fileUri参数统一处理不同来源的文件预览。以下是具体实现方法:
-
本地文件预览
使用fileio模块获取文件URI:let fileUri = 'file://' + context.filesDir + '/sample.pdf'; FilePreview.preview({ fileUri: fileUri }); -
rawfile资源文件预览
通过ResourceManager获取资源路径:let rawfileUri = 'resource://rawfile/sample.pdf'; FilePreview.preview({ fileUri: rawfileUri }); -
网络文件预览
需先通过@ohos.request下载文件到本地,再使用本地URI预览:// 下载完成后获取本地缓存路径 let downloadedUri = 'file://.../cache/sample.pdf'; FilePreview.preview({ fileUri: downloadedUri });
关键点:
- FilePreview自动识别文件类型(PDF、图片、文本等)
- 网络文件需确保下载完成且具有有效本地路径
- 支持通过
startAbility传递预览参数实现跨应用调用 - 系统会根据文件类型调用对应的预览应用
这种设计实现了不同文件源的统一预览接口,开发者无需关心具体文件解析逻辑。

