NestJS中使用Multer管理上传文件时如何为其指定文件扩展名
NestJS 环境下Multer自定义上传文件名与扩展名的正确实现
报错本质
直接在FilesInterceptor的配置对象顶层写入filename回调会触发TS2345类型报错,核心是NestJS封装的MulterOptions类型仅识别Multer原生的顶层配置属性。filename属于Multer磁盘存储引擎(DiskStorage)的专属回调参数,并非MulterOptions的顶层可配置项,因此会被TS判定为不存在的非法属性。
正确实现路径
- 独立实例化Multer提供的磁盘存储引擎
diskStorage,将文件存储路径、文件名生成逻辑全部配置在该存储引擎的参数中 - 将实例化完成的存储引擎,通过MulterOptions的
storage属性传入拦截器配置 - 在文件名生成回调中按需求拼接指定文件扩展名,即可实现自定义后缀的效果
可直接落地的代码示例
import { Controller, Post, UseInterceptors, UploadedFiles } from '@nestjs/common'; import { FilesInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; @Controller('file') export class FileUploadController { @Post('upload') @UseInterceptors( FilesInterceptor('images', 10, { storage: diskStorage({ // 原配置中的dest存储路径挪到此处配置 destination: './uploads', filename: (req, file, callback) => { // 实现需求:时间戳拼接.jpg后缀 callback(null, `${Date.now()}.jpg`); } }) }) ) uploadMultiple(@UploadedFiles() files) { console.log(files, 'test'); } }
高频踩坑提醒
- 一旦在MulterOptions中传入自定义
storage实例,配置项中的顶层dest属性会完全失效,所有存储路径逻辑都需要在diskStorage的配置内完成 - 若不需要强制固定所有上传文件为.jpg后缀,可结合
file.mimetype动态匹配对应扩展名,避免非对应类型的文件被强行修改后缀导致损坏,示例逻辑:// 动态匹配图片扩展名的参考逻辑 const extMap = { 'image/jpeg': '.jpg', 'image/png': '.png', 'image/gif': '.gif' } callback(null, `${Date.now()}${extMap[file.mimetype] || '.jpg'}`) - 需提前安装
@types/multer作为项目开发依赖,否则会出现TS无法识别diskStorage导出类型的报错
内容的提问来源于stack exchange,提问作者Asking
相关产品推荐
相关产品推荐

