鸿蒙NEXT开发文件预览工具类(ArkTs)

复制代码
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");
  }
}
代码如下:
TypeScript 复制代码
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");
  }
}
相关推荐
爱写代码的森8 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
世人万千丶9 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
90后的晨仔11 小时前
鸿蒙开发实战:图片完整显示、不失真、不留白 —— 深入理解 ImageFit 与动态宽高比适配
harmonyos
HLC++12 小时前
Linux的进程间通信
android·linux·服务器
程序员黑豆13 小时前
鸿蒙应用开发实战:从零学会自定义组件
前端·华为·harmonyos
爱笑鱼15 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
qizayaoshuap15 小时前
# [特殊字符] 名言警句 — 鸿蒙ArkTS数据管理与随机展示系统
华为·harmonyos
FrameNotWork15 小时前
HarmonyOS 6.0 LocalStorage页面级存储
华为·交互·harmonyos
爱笑鱼16 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
FF2501_9402285816 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统