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

Ts.ED+Express环境下Multer仅支持PNG/JPG,WebP等无法写入磁盘

Ts.ED + Multer 文件上传异常排查:非PNG/JPG文件返回200但磁盘无文件

原本基于Ts.ED(Express上层框架)搭建的文件上传接口支持PNG/JPG格式,修改fileFilter尝试仅允许WebP后,出现异常:除PNG/JPG外,WebP、PDF、SVG等格式上传时接口返回200,Multer返回的文件对象显示保存成功,但磁盘中无对应文件。

配置代码

自定义磁盘存储配置

const storage = multer.diskStorage({
  destination: function (req: any, file: any, cb: any) {
    cb(null, './uploads')
  },
  filename: function (req: any, file: any, cb: any) {
      let extArray = file.mimetype.split("/");
      let extension = extArray[extArray.length - 1];
      cb(null, file.fieldname + '-' + uuidv4() + '.' +extension)
  }
})

Ts.ED Multer全局配置

multer: {
  storage: storage,
  dest: `${process.cwd()}/uploads`,
  limits: {
    fileSize: 7340032,
  },
  fileFilter: (_req: any, file: any, cb: any) => {
      // 原本有检查mimetype的逻辑,测试时已移除
      return cb(null, true);
  }
}

上传端点代码

@Post("/photo")
@Authorize("jwt") @Security("jwt")
@Returns(200) 
@Returns(401) 
@Returns(404)
private async simpleUpload(
  @MultipartFile("file") 
  file: PlatformMulterFile) {
  if (!file) {
    throw new NotFound('file not found');
  }
  console.log(file);
  return{filename : file.filename}
}

日志输出示例

PDF上传日志

{
  fieldname: 'file',
  originalname: 'pauline.pdf',
  encoding: '7bit',
  mimetype: 'application/pdf',
  destination: './uploads',
  filename: 'file-f6219302-1491-47f0-b10f-883fdc6ef15a.pdf',
  path: 'uploads/file-f6219302-1491-47f0-b10f-883fdc6ef15a.pdf',
  size: 12033
}

SVG上传日志

{
  fieldname: 'file',
  originalname: 'mouse_logo.svg',
  encoding: '7bit',
  mimetype: 'image/svg+xml',
  destination: './uploads',
  filename: 'file-138c1a1f-9b80-4f6c-b474-dfd25afaaf50.svg+xml',
  path: 'uploads/file-138c1a1f-9b80-4f6c-b474-dfd25afaaf50.svg+xml',
  size: 1076
}

排查方向

  • 检查文件路径与权限:
    日志中显示的path为相对路径,确认当前进程工作目录是否正确,./uploads目录是否具备进程写入权限。建议替换为绝对路径(如path.join(process.cwd(), 'uploads')),避免相对路径导致文件写入位置偏差。
  • 清理Multer配置冲突项:
    同时配置storage和dest会导致Multer逻辑冲突,优先使用storage时dest可能干扰临时文件处理。移除dest配置,仅保留自定义storage。
  • 修正文件名生成逻辑:
    SVG文件名后缀为svg+xml,特殊字符可能导致系统无法正常识别文件。可从originalname提取后缀,或手动映射mimetype到正确后缀(如image/svg+xml对应svg),避免生成异常文件名。
  • 排查临时文件处理流程:
    Multer会先将文件写入临时目录再移动到目标目录,检查系统临时目录是否有残留文件,确认是否是文件移动步骤失败但未抛出异常。
  • 检查Ts.ED框架钩子:
    排查Ts.ED全局中间件或文件处理钩子,确认是否存在自动删除非PNG/JPG文件、拦截文件写入的逻辑。

内容的提问来源于stack exchange,提问作者bernard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:49