import { uniformTypeDescriptor } from '@kit.ArkData';
import { filePreview } from '@kit.PreviewKit';
import { FileUtil } from './FileUtil';
import { AppUtil } from './AppUtil';
import { WantUtil } from './WantUtil';
/**
* 文件预览工具类
* 提供文件预览、加载、判断等功能。
* author: CSDN-鸿蒙布道师
* since: 2025/04/16
*/
export class PreviewUtil {
/**
* 通过传入文件预览信息,打开预览窗口。1秒内重复调用无效。
* @param previewInfo 文件的预览信息
* @returns Promise<void>
*/
static openPreview(previewInfo: filePreview.PreviewInfo): Promise<void> {
if (!previewInfo) {
throw new Error("PreviewInfo cannot be empty.");
}
return filePreview.openPreview(AppUtil.getContext(), previewInfo);
}
/**
* 通过传入文件的 URI,打开预览窗口。1秒内重复调用无效。
* @param uri 文件的 URI
* @returns Promise<void>
*/
static async openPreviewEasy(uri: string): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const previewInfo = PreviewUtil.generatePreviewInfo(uri);
return filePreview.openPreview(AppUtil.getContext(), previewInfo);
}
/**
* 根据文件的 URI 判断文件是否可预览。
* @param uri 文件的 URI
* @returns Promise<boolean>
*/
static canPreview(uri: string): Promise<boolean> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
return filePreview.canPreview(AppUtil.getContext(), uri);
}
/**
* 判断预览窗口是否已经存在。
* @returns Promise<boolean>
*/
static hasDisplayed(): Promise<boolean> {
return filePreview.hasDisplayed(AppUtil.getContext());
}
/**
* 关闭预览窗口,仅当预览窗口存在时起效。
*/
static closePreview(): void {
filePreview.closePreview(AppUtil.getContext());
}
/**
* 加载预览文件信息。仅当预览窗口存在时起效。
* @param previewInfo 文件的预览信息
* @returns Promise<void>
*/
static loadData(previewInfo: filePreview.PreviewInfo): Promise<void> {
if (!previewInfo) {
throw new Error("PreviewInfo cannot be empty.");
}
return filePreview.loadData(AppUtil.getContext(), previewInfo);
}
/**
* 加载预览文件信息。仅当预览窗口存在时起效。
* @param uri 文件的 URI
* @returns Promise<void>
*/
static async loadDataEasy(uri: string): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const previewInfo = PreviewUtil.generatePreviewInfo(uri);
return filePreview.loadData(AppUtil.getContext(), previewInfo);
}
/**
* 调用其他应用预览文件。
* @param uri 文件的 URI
* @param write 是否有写入权限,默认为 true
* @returns Promise<void>
*/
static onSharePreview(uri: string, write: boolean = true): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
return WantUtil.openFile(uri, write);
}
/**
* 根据文件 URI 构建 PreviewInfo。
* @param uri 文件的 URI
* @returns filePreview.PreviewInfo
*/
static generatePreviewInfo(uri: string): filePreview.PreviewInfo {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const fileName = FileUtil.getFileName(uri);
const fileExtention = FileUtil.getFileExtention(fileName);
const mimeType = PreviewUtil.getMimeType(fileExtention);
return {
title: fileName,
uri: uri,
mimeType: mimeType,
};
}
/**
* 根据文件后缀名获取 TypeDescriptor(标准化数据类型的描述类)。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns uniformTypeDescriptor.TypeDescriptor
*/
static getTypeDescriptor(fileExtention: string): uniformTypeDescriptor.TypeDescriptor {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const dataType = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(`.${fileExtention}`);
return uniformTypeDescriptor.getTypeDescriptor(dataType);
}
/**
* 根据文件后缀名获取文件 MIME 类型。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns string
*/
static getMimeType(fileExtention: string): string {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const typeDescriptor = PreviewUtil.getTypeDescriptor(fileExtention);
return typeDescriptor.mimeTypes && typeDescriptor.mimeTypes.length > 0 ? typeDescriptor.mimeTypes[0] : '*/*';
}
/**
* 根据文件后缀名获取对应文件类型的图标。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns string
*/
static getIconFileStr(fileExtention: string): string {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const descriptor = PreviewUtil.getTypeDescriptor(fileExtention);
return descriptor.iconFile;
}
/**
* 判断当前设备是否支持文件预览能力。
* @returns boolean
*/
static canIUsePreview(): boolean {
return canIUse("SystemCapability.Filemanagement.FilePreview.Core");
}
}
代码如下:
import { uniformTypeDescriptor } from '@kit.ArkData';
import { filePreview } from '@kit.PreviewKit';
import { FileUtil } from './FileUtil';
import { AppUtil } from './AppUtil';
import { WantUtil } from './WantUtil';
/**
* 文件预览工具类
* 提供文件预览、加载、判断等功能。
* author: CSDN-鸿蒙布道师
* since: 2025/04/16
*/
export class PreviewUtil {
/**
* 通过传入文件预览信息,打开预览窗口。1秒内重复调用无效。
* @param previewInfo 文件的预览信息
* @returns Promise<void>
*/
static openPreview(previewInfo: filePreview.PreviewInfo): Promise<void> {
if (!previewInfo) {
throw new Error("PreviewInfo cannot be empty.");
}
return filePreview.openPreview(AppUtil.getContext(), previewInfo);
}
/**
* 通过传入文件的 URI,打开预览窗口。1秒内重复调用无效。
* @param uri 文件的 URI
* @returns Promise<void>
*/
static async openPreviewEasy(uri: string): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const previewInfo = PreviewUtil.generatePreviewInfo(uri);
return filePreview.openPreview(AppUtil.getContext(), previewInfo);
}
/**
* 根据文件的 URI 判断文件是否可预览。
* @param uri 文件的 URI
* @returns Promise<boolean>
*/
static canPreview(uri: string): Promise<boolean> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
return filePreview.canPreview(AppUtil.getContext(), uri);
}
/**
* 判断预览窗口是否已经存在。
* @returns Promise<boolean>
*/
static hasDisplayed(): Promise<boolean> {
return filePreview.hasDisplayed(AppUtil.getContext());
}
/**
* 关闭预览窗口,仅当预览窗口存在时起效。
*/
static closePreview(): void {
filePreview.closePreview(AppUtil.getContext());
}
/**
* 加载预览文件信息。仅当预览窗口存在时起效。
* @param previewInfo 文件的预览信息
* @returns Promise<void>
*/
static loadData(previewInfo: filePreview.PreviewInfo): Promise<void> {
if (!previewInfo) {
throw new Error("PreviewInfo cannot be empty.");
}
return filePreview.loadData(AppUtil.getContext(), previewInfo);
}
/**
* 加载预览文件信息。仅当预览窗口存在时起效。
* @param uri 文件的 URI
* @returns Promise<void>
*/
static async loadDataEasy(uri: string): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const previewInfo = PreviewUtil.generatePreviewInfo(uri);
return filePreview.loadData(AppUtil.getContext(), previewInfo);
}
/**
* 调用其他应用预览文件。
* @param uri 文件的 URI
* @param write 是否有写入权限,默认为 true
* @returns Promise<void>
*/
static onSharePreview(uri: string, write: boolean = true): Promise<void> {
if (!uri) {
throw new Error("URI cannot be empty.");
}
return WantUtil.openFile(uri, write);
}
/**
* 根据文件 URI 构建 PreviewInfo。
* @param uri 文件的 URI
* @returns filePreview.PreviewInfo
*/
static generatePreviewInfo(uri: string): filePreview.PreviewInfo {
if (!uri) {
throw new Error("URI cannot be empty.");
}
const fileName = FileUtil.getFileName(uri);
const fileExtention = FileUtil.getFileExtention(fileName);
const mimeType = PreviewUtil.getMimeType(fileExtention);
return {
title: fileName,
uri: uri,
mimeType: mimeType,
};
}
/**
* 根据文件后缀名获取 TypeDescriptor(标准化数据类型的描述类)。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns uniformTypeDescriptor.TypeDescriptor
*/
static getTypeDescriptor(fileExtention: string): uniformTypeDescriptor.TypeDescriptor {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const dataType = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(`.${fileExtention}`);
return uniformTypeDescriptor.getTypeDescriptor(dataType);
}
/**
* 根据文件后缀名获取文件 MIME 类型。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns string
*/
static getMimeType(fileExtention: string): string {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const typeDescriptor = PreviewUtil.getTypeDescriptor(fileExtention);
return typeDescriptor.mimeTypes && typeDescriptor.mimeTypes.length > 0 ? typeDescriptor.mimeTypes[0] : '*/*';
}
/**
* 根据文件后缀名获取对应文件类型的图标。
* @param fileExtention 文件后缀名,例如:html txt doc ts mp3
* @returns string
*/
static getIconFileStr(fileExtention: string): string {
if (!fileExtention) {
throw new Error("File extension cannot be empty.");
}
const descriptor = PreviewUtil.getTypeDescriptor(fileExtention);
return descriptor.iconFile;
}
/**
* 判断当前设备是否支持文件预览能力。
* @returns boolean
*/
static canIUsePreview(): boolean {
return canIUse("SystemCapability.Filemanagement.FilePreview.Core");
}
}