strapi v4自定义文件名
本文采用文件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,
};