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

发布于:2025-04-22 ⋅ 阅读:(13) ⋅ 点赞:(0)
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");
  }
}


网站公告

今日签到

点亮在社区的每一天
去签到