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

Node.js上传超4~5GB文件时POST请求触发连接重置,求解决方案

大文件(4~5GB+)通过Multer上传触发ERR_CONNECTION_RESET的解决思路

问题背景

使用Multer向Node.js服务器上传包含文件二进制数据及文本/对象的FormData,当文件大小超过4~5GB时,POST请求先处于pending状态,一段时间后返回错误:

POST http://localhost:5000/upload net::ERR_CONNECTION_RESET

已尝试但无效的操作:

  • 中间件中设置req.setTimeout
  • 配置req.connection.setTimeout
  • 全局设置server.timeout为超大值
  • 为上传端点添加connect-timeout中间件
  • 为请求端axios设置高超时值

怀疑与socket连接管理有关,但调整req.connection超时未解决问题。


可行解决方向

1. 优化Multer存储与限制配置

Multer默认会将部分文件内容存入内存,大文件易引发内存溢出或底层连接中断。改用磁盘存储并显式放宽限制:

const multer = require('multer');
const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, './uploads'),
  filename: (req, file, cb) => cb(null, `${Date.now()}-${file.originalname}`)
});

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 10 * 1024 * 1024 * 1024, // 设为10GB,按需调整
    fieldSize: 1024 * 1024 * 1024 // 文本字段大小限制
  },
  preservePath: true
});

2. 调整Node.js HTTP服务器核心参数

仅设置server.timeout不够,需补充调整headersTimeout和requestTimeout(Node.js v14.11.0+支持),避免服务器主动中断长连接:

const http = require('http');
const server = http.createServer(app);

server.timeout = 0; // 禁用超时,或设为足够大的值(如24*60*60*1000)
server.headersTimeout = 0;
server.requestTimeout = 0;

server.listen(5000);

3. 检查并修改操作系统级限制

  • 文件描述符限制:大文件上传会占用更多套接字和文件描述符,查看当前限制:ulimit -n,临时调整为更大值:ulimit -n 65535,或修改系统配置文件(如/etc/security/limits.conf)永久生效。
  • TCP连接存活参数:Linux系统下调整TCP keepalive参数,防止系统主动断开长时间传输的连接:
    # 临时生效
    echo 1 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 1 > /proc/sys/net/ipv4/tcp_keepalive_intvl
    echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
    

4. 改用分块上传方案

超大型文件单块上传本身存在诸多限制,建议拆分文件为小片段(如500MB/块)逐个上传,服务器端接收后合并文件,同时可实现断点续传,大幅提升可靠性。

5. 排查网络层限制

  • 本地测试时,检查路由器、防火墙是否设置了连接超时或流量阈值
  • 远程服务器场景,确认云服务商的负载均衡、安全组是否存在上传大小或连接时长限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:25:23