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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:47:04