ts 实现文件信息整理 提供 类 和 工具类两种形式,并提供 js 版本

适用于前端工程化的项目

类模式

class CustomFile {
  private readonly file: File;

  /**
   * 构造函数,接受一个 File 对象作为参数
   * @param file 要封装的文件
   */
  constructor(file: File) {
    this.file = file;
  }

  /**
   * 获取文件大小,返回一个数字,表示文件的字节数
   */
  getSize(): number {
    return this.file.size;
  }

  /**
   * 获取文件名,返回一个字符串,表示文件的名称
   */
  getName(): string {
    return this.file.name;
  }

  /**
   * 获取文件后缀,返回一个字符串,表示文件的后缀名(不包括点号)
   */
  getExtension(): string {
    const extension = this.getName().split('.').pop();
    return extension ? extension.toLowerCase() : '';
  }

  /**
   * 获取文件类型,返回一个字符串,表示文件的 MIME 类型
   */
  getType(): string {
    return this.file.type;
  }

  /**
   * 获取文件 MIME,返回一个字符串,表示文件的 MIME 类型。
   * 如果文件类型不是图片,则返回 `application/{extension}` 格式的 MIME 类型,
   * 其中 `{extension}` 是文件后缀。
   */
  getMime(): string {
    const type = this.getType();
    const extension = this.getExtension();
    switch (type) {
      case 'image/jpeg':
        return 'image/jpeg';
      case 'image/png':
        return 'image/png';
      default:
        return extension ? `application/${extension}` : '';
    }
  }

  /**
   * 格式化文件大小,返回一个字符串,表示文件大小的可读格式,例如 `1.23 MB`
   */
  getFormattedSize(): string {
    const size = this.getSize();
    const units = ['B', 'KB', 'MB', 'GB', 'TB'];
    let index = 0;
    while (size >= 1024 && index < units.length - 1) {
      size /= 1024;
      index++;
    }
    return `${size.toFixed(2)} ${units[index]}`;
  }

  /**
   * 检查文件是否是特定后缀
   * @param extension 要检查的后缀名(不包括点号)
   * @returns 如果文件后缀与指定后缀相同(不区分大小写),则返回 `true`,否则返回 `false`
   */
  hasExtension(extension: string): boolean {
    return this.getExtension() === extension.toLowerCase();
  }
}

工具类模式

/**
 * 获取文件大小,返回一个数字,表示文件的字节数
 * @param file 要获取大小的文件
 */
export function getFileSize(file: File): number {
  return file.size;
}

/**
 * 获取文件名,返回一个字符串,表示文件的名称
 * @param file 要获取名称的文件
 */
export function getFileName(file: File): string {
  return file.name;
}

/**
 * 获取文件后缀,返回一个字符串,表示文件的后缀名(不包括点号)
 * @param file 要获取后缀的文件
 */
export function getFileExtension(file: File): string {
  const extension = file.name.split('.').pop();
  return extension ? extension.toLowerCase() : '';
}

/**
 * 获取文件类型,返回一个字符串,表示文件的 MIME 类型
 * @param file 要获取类型的文件
 */
export function getFileType(file: File): string {
  return file.type;
}

/**
 * 获取文件 MIME,返回一个字符串,表示文件的 MIME 类型。
 * 如果文件类型不是图片,则返回 `application/{extension}` 格式的 MIME 类型,
 * 其中 `{extension}` 是文件后缀。
 * @param file 要获取 MIME 的文件
 */
export function getFileMime(file: File): string {
  const type = getFileType(file);
  const extension = getFileExtension(file);
  switch (type) {
    case 'image/jpeg':
      return 'image/jpeg';
    case 'image/png':
      return 'image/png';
    default:
      return extension ? `application/${extension}` : '';
  }
}

/**
 * 格式化文件大小,返回一个字符串,表示文件大小的可读格式,例如 `1.23 MB`
 * @param size 文件大小,单位为字节
 */
export function formatFileSize(size: number): string {
  const units = ['B', 'KB', 'MB', 'GB', 'TB'];
  let index = 0;
  while (size >= 1024 && index < units.length - 1) {
    size /= 1024;
    index++;
  }
  return `${size.toFixed(2)} ${units[index]}`;
}

/**
 * 检查文件是否是特定后缀
 * @param file 要检查后缀的文件
 * @param extension 要检查的后缀名(不包括点号)
 * @returns 如果文件后缀与指定后缀相同(不区分大小写),则返回 `true`,否则返回 `false`
 */
export function hasFileExtension(file: File, extension: string): boolean {
  return getFileExtension(file) === extension.toLowerCase();
}

JS 版本

function getFileSize(file) {
  return file.size;
}

function getFileName(file) {
  return file.name;
}

function getFileExtension(file) {
  const extension = file.name.split('.').pop();
  return extension ? extension.toLowerCase() : '';
}

function getFileType(file) {
  return file.type;
}

function getFileMime(file) {
  const type = getFileType(file);
  const extension = getFileExtension(file);
  switch (type) {
    case 'image/jpeg':
      return 'image/jpeg';
    case 'image/png':
      return 'image/png';
    default:
      return extension ? `application/${extension}` : '';
  }
}

function formatFileSize(size) {
  const units = ['B', 'KB', 'MB', 'GB', 'TB'];
  let index = 0;
  while (size >= 1024 && index < units.length - 1) {
    size /= 1024;
    index++;
  }
  return `${size.toFixed(2)} ${units[index]}`;
}

function hasFileExtension(file, extension) {
  return getFileExtension(file) === extension.toLowerCase();
}

module.exports = {
  getFileSize,
  getFileName,
  getFileExtension,
  getFileType,
  getFileMime,
  formatFileSize,
  hasFileExtension,
};