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

NestJS文件上传验证:文件字段为空或不存在的校验问题

问题

需要验证用户是否正确将文件发送到指定字段:控制器需校验multipart form data中是否存在file字段,且该字段关联真实文件并已发送。

现有代码如下:

@UseInterceptors(FileInterceptor('file'))
@Post('file/pass-validation')
uploadFileAndPassValidation(
    @UploadedFile(
        /*new ParseFilePipeBuilder()
            .addFileTypeValidator({
                fileType: 'jpeg',
            })
            .build({errorHttpStatusCode: 400}),*/
    )
    file: Express.Multer.File,
) {
    console.log(file)
    return true;
}

当前遇到的问题:

  • 空表单请求时,控制台输出undefined,但期望返回400 Bad Request
  • 启用注释中的ParseFilePipe后,出现500内部服务器错误,原因是管道尝试对undefined的文件变量执行操作
解决方案

核心问题是没给ParseFilePipe添加必填验证规则,导致当file字段不存在时,管道拿到的是undefined,进而触发内部错误。只需要在ParseFilePipeBuilder链中加入addRequiredValidator()即可解决。

修改后的完整代码:

import { HttpStatus, UseInterceptors, Post, UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { ParseFilePipeBuilder } from '@nestjs/common';

@UseInterceptors(FileInterceptor('file'))
@Post('file/pass-validation')
uploadFileAndPassValidation(
    @UploadedFile(
        new ParseFilePipeBuilder()
            .addRequiredValidator() // 强制校验file字段存在且为有效文件
            .addFileTypeValidator({
                fileType: 'jpeg',
            })
            .build({errorHttpStatusCode: HttpStatus.BAD_REQUEST}),
    )
    file: Express.Multer.File,
) {
    console.log(file);
    return true;
}

关键细节

  • addRequiredValidator():会自动校验multipart form data中是否存在file字段,且该字段对应的是真实上传的文件(不是空的表单字段)。验证失败时直接返回400状态码,不会出现500错误。
  • 用HttpStatus.BAD_REQUEST替代硬编码的400,代码更规范且可读性更高。
  • 现在空表单请求、未上传文件或者上传非jpeg文件时,都会返回符合预期的400 Bad Request响应。

内容的提问来源于stack exchange,提问作者Bernard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:48:19