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
相关产品推荐
相关产品推荐

