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

NestJS结合DTO上传多文件时出现请求实体过大错误如何解决?

问题解决步骤

问题根因

你遇到的PayloadTooLargeError是添加DTO后才触发的,核心原因有两个:

  1. 你配置的json、urlencoded请求体限制仅对对应Content-Type的请求生效,上传文件用的multipart/form-data请求由multer组件单独处理,其默认字段大小限制极低
  2. 不加DTO时Nest不会额外解析请求里的普通字段,添加DTO后普通字段会被全量解析,触发multer默认的普通字段(非文件字段)大小上限(默认仅100KB)

具体修复方案

第一步:正确配置multer拦截器的大小限制

在FileFieldsInterceptor的第二个参数里补充完整的limits配置,同时限制文件和普通字段的大小:

@Post()
@UseInterceptors(
  FileFieldsInterceptor(
    [
      { name: 'picture', maxCount: 1 },
      { name: 'audio', maxCount: 1 },
    ],
    {
      limits: {
        fileSize: 50 * 1024 * 1024, // 单个文件最大50MB,可按需调整
        fieldSize: 50 * 1024 * 1024, // 单个普通字段最大50MB,解决DTO解析触发的超限问题
        fields: 20, // 允许的最大普通字段数量,按需调整
      },
    }
  ),
)
create(@UploadedFiles() files, @Body() dto: CreateTrackDto) {
  console.log('files', files);
  return this.trackService.create(dto, '', '');
}

第二步:确认请求体限制配置生效

如果还存在报错,先关闭Nest默认的bodyParser,手动配置全局请求体限制:
修改main.ts的初始化逻辑:

import * as bodyParser from 'body-parser';

async function bootstrap() {
  // 关闭默认body解析,避免提前解析multipart请求触发超限
  const app = await NestFactory.create(AppModule, {
    bodyParser: false,
  });
  // 手动配置json和表单请求的大小限制,去掉原有注释使其生效
  app.use(bodyParser.json({ limit: '50mb' }));
  app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));
  
  await app.listen(3000);
}
bootstrap();

第三步:校验DTO配置

确认你的CreateTrackDto中没有包含picture、audio这两个文件字段,避免class-validator将文件内容纳入校验逻辑额外占用体积,若开启了whitelist校验也不会误将文件字段纳入处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:02