本文采用文件md5
在src/index.js

  register({ strapi }) {
    // Override the default upload info formatter with custom function.
    strapi.services["plugin::upload.upload"].formatFileInfo =
      require("./extensions/upload/overrides").formatFileInfoOverride;
    strapi.services["plugin::upload.upload"].enhanceAndValidateFile =
      require("./extensions/upload/overrides").enhanceAndValidateFileOverride;
  },

overrides.js

const _ = require("lodash");
const path = require("path");
const { extension } = require("mime-types");
const crypto = require("crypto");
const fs = require("fs");

/**
 * Overriding formatFileInfo function for upload plugin to
 * maintain original file naming.
 */
async function formatFileInfoOverride(
  { size, type, filename, filepath },
  fileInfo = {},
  metas = {}
) {
  const fileService = strapi.plugin("upload").service("file");
  console.log("fileService", fileService);

  let ext = path.extname(filename);

  if (!ext) {
    ext = `.${extension(type)}`;
  }
  const usedName = (fileInfo.name || filename).normalize();
  const basename = path.basename(usedName, ext);

  // 计算文件的 MD5 值
  const fileBuffer = await fs.promises.readFile(filepath);
  const md5sum = crypto.createHash("md5").update(fileBuffer).digest("hex");

  // 使用 MD5 值作为文件名
  const customFileName = `${md5sum}`;

  const entity = {
    ext,
    mime: type,
    hash: md5sum,
    name: usedName,
    folder: fileInfo.folder,
    caption: fileInfo.caption,
    alternativeText: fileInfo.alternativeText,
    size: Math.round((size / 1000) * 100) / 100,
    folderPath: await fileService.getFolderPath(fileInfo.folder),
  };

  const { refId, ref, field } = metas;

  if (refId && ref && field) {
    entity.related = [
      {
        id: refId,
        __type: ref,
        __pivot: { field },
      },
    ];
  }

  if (metas.path) {
    entity.path = metas.path;
  }

  if (metas.tmpWorkingDirectory) {
    entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;
  }
  console.log("entity", entity);
  return entity;
}
async function enhanceAndValidateFileOverride(file, fileInfo = {}, metas = {}) {
  console.log("enhanceAndValidateFile", file);
  const currentFile = await this.formatFileInfo(
    {
      filename: file.name,
      type: file.type,
      size: file.size,
      filepath: file.path,
    },
    fileInfo,
    {
      ...metas,
      tmpWorkingDirectory: file.tmpWorkingDirectory,
    }
  );
  currentFile.getStream = () => fs.createReadStream(file.path);

  const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi
    .plugin("upload")
    .service("image-manipulation");

  if (await isImage(currentFile)) {
    if (await isFaultyImage(currentFile)) {
      throw new ApplicationError("File is not a valid image");
    }
    if (await isOptimizableImage(currentFile)) {
      return optimize(currentFile);
    }
  }
  return currentFile;
}
module.exports = {
  formatFileInfoOverride,
  enhanceAndValidateFileOverride,
};

标签: cms

添加新评论