NestJS图片上传失败求助:自定义文件命名触发ENOENT错误
问题解决:NestJS文件上传时的文件名配置错误
错误原因
你把前端访问用的完整URL当成了磁盘存储的文件名,这是核心错误。diskStorage的filename字段仅负责定义文件在服务器磁盘上的存储名称,不能包含域名、协议这类URL内容——系统会把这些字符当成路径的一部分去解析,导致找不到对应的目录结构,最终触发ENOENT错误。
正确处理方式
分两步处理:
- 磁盘存储时,仅生成「随机文件名+原文件扩展名」,保存在指定的
./files目录下 - 控制器处理完上传请求后,拼接域名+文件存储路径,返回给前端作为访问URL
修改后的代码示例
1. 修正FileInterceptor配置
FileInterceptor('image', { storage: diskStorage({ destination: './files', filename: (req, file, cb) => { const randomName = Array(32) .fill(null) .map(() => Math.round(Math.random() * 16).toString(16)) .join(''); // 仅保存随机名+扩展名,不要带URL前缀 return cb(null, `${randomName}${extname(file.originalname)}`); }, }), }),
2. 控制器中返回访问URL
在控制器方法里拼接完整访问地址返回给前端:
@Post('upload') @UseInterceptors(FileInterceptor('image')) uploadFile(@UploadedFile() file: Express.Multer.File) { // 拼接前端访问用的完整URL const fileUrl = `http://localhost:3001/files/${file.filename}`; return { message: '文件上传成功', fileUrl }; }
额外提示
- 可以把域名配置抽离到NestJS的配置文件中(比如
config.service.ts),避免硬编码 - 确保
./files目录存在,Multer默认不会自动创建目录,你可以在项目启动时手动创建,或者用mkdirp工具自动生成
内容的提问来源于stack exchange,提问作者wahyu nanda
相关产品推荐
相关产品推荐

