覆写Strapi Upload插件时遇this.enhanceAndValidateFile非函数错误
解决Strapi Upload插件覆写错误并限制仅上传图片
错误原因分析
你遇到的this.enhanceAndValidateFile is not a function错误,根源在于服务覆写方式不正确:
overrides.ts导出的是接收strapi参数的工厂函数,但你在src/Index.ts中直接将该函数赋值给服务方法,未传入strapi实例,导致函数无法正确初始化。- 直接修改
strapi.services["plugin::upload.upload"]的属性并非Strapi官方推荐的服务覆写方式,容易造成上下文丢失。
正确实现方案
Strapi推荐通过extensions目录直接重写插件服务,以下是完整修正代码:
步骤1:创建服务覆写文件
在项目根目录下创建(或修改)src/extensions/upload/services/Upload.ts(JS环境用.js),内容如下:
const fs = require('fs'); const { errors: { ApplicationError }, } = require('@strapi/utils'); module.exports = ({ strapi }) => { // 获取原Upload服务的所有方法 const originalUploadService = strapi.services['plugin::upload.upload']; // 覆写enhanceAndValidateFile方法 return { ...originalUploadService, async enhanceAndValidateFile(file, fileInfo = {}, metas = {}) { const currentFile = await strapi.formatFileInfo( { filename: file.name, type: file.type, size: file.size, }, 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))) { throw new ApplicationError('仅允许上传图片类型文件'); } console.log("是图片文件"); // 保留原有图片校验逻辑 if (await isFaultyImage(currentFile)) { throw new ApplicationError('文件不是有效的图片'); } if (await isOptimizableImage(currentFile)) { return optimize(currentFile); } return currentFile; }, }; };
步骤2:移除错误覆写代码
删除src/Index.ts中对enhanceAndValidateFile的赋值代码,无需在自定义插件的register方法中手动修改服务。
步骤3:重启Strapi服务
修改完成后重启应用,新逻辑自动生效:
npm run develop
效果说明
- 上传非图片文件时,会直接返回
仅允许上传图片类型文件的错误提示。 - 上传图片时,执行原有校验与优化逻辑,同时输出控制台日志。
内容的提问来源于stack exchange,提问作者SAM
相关产品推荐
相关产品推荐

