You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

覆写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:35:16