NestJS中如何通过Multer拦截器设置文件最大上传大小并支持可选上传
实现可选文件上传并限制大小(NestJS)
要实现文件上传可选且限制最大上传大小的需求,只需对现有代码做两处核心修改,同时可按需添加异常处理:
1. 标记文件为可选
在@UploadedFile()装饰器中添加{ required: false }配置,这样当客户端未上传文件时,file参数会被设为undefined,不会触发必填校验错误。
2. 配置文件大小限制
在FileInterceptor的第二个参数中设置limits选项,通过fileSize指定允许的最大文件字节数(示例设为10MB)。
完整代码示例
import { Controller, Post, UseInterceptors, UploadedFile, Body, UseFilters, HttpStatus } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { MulterError } from 'multer'; import { Response } from 'express'; // 可选:处理文件上传异常的过滤器 @Catch(MulterError) export class MulterExceptionFilter { catch(exception: MulterError, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse<Response>(); if (exception.code === 'LIMIT_FILE_SIZE') { response.status(HttpStatus.PAYLOAD_TOO_LARGE).json({ message: '文件大小超出限制,请上传不超过10MB的文件', statusCode: HttpStatus.PAYLOAD_TOO_LARGE, }); } else { response.status(HttpStatus.BAD_REQUEST).json({ message: '文件上传失败', statusCode: HttpStatus.BAD_REQUEST, }); } } } @Controller() export class UploadController { @Post("fileUpload") @UseInterceptors(FileInterceptor("file", { limits: { fileSize: 10 * 1024 * 1024, // 限制单个文件最大为10MB(字节数) }, // 可选:添加文件类型过滤,比如只允许图片 // fileFilter: (req, file, callback) => { // if (!file.mimetype.startsWith('image/')) { // callback(new Error('仅允许上传图片文件'), false); // } else { // callback(null, true); // } // }, })) @UseFilters(MulterExceptionFilter) // 可选:启用异常过滤器 private async fileUpload( @UploadedFile({ required: false }) file: Express.Multer.File | undefined, @Body() body ) { if (file) { console.log("上传文件信息:", file); return { message: "文件上传成功", fileInfo: { originalname: file.originalname, size: file.size } }; } else { console.log("未上传文件,请求体内容:", body); return { message: "无文件上传,请求已接收", body }; } } }
关键说明
- 可选文件上传:
@UploadedFile({ required: false })是核心,确保无文件时请求不会被拦截。 - 大小限制:
limits.fileSize的单位是字节,可根据需求调整(比如5MB就是5*1024*1024)。 - 异常处理:添加
MulterExceptionFilter可以捕获文件大小超限、文件类型不匹配等上传错误,返回更友好的响应。
内容的提问来源于stack exchange,提问作者user1715
相关产品推荐
相关产品推荐

