Node.js使用express-fileupload上传超70MB视频故障及优化方案咨询
问题根因排查
首先确认两个配置项是否正确:
- 你当前只做了业务层的文件大小校验,没有在
express-fileupload初始化时开启临时文件配置和全局大小限制,该模块默认将小于50MB的文件存入内存,超过阈值后如果没有开启useTempFiles参数,会触发内存溢出导致进程无响应,看起来就是请求陷入无限循环 - 未调整express内置bodyParser的大小限制,bodyParser默认请求大小限制为100kb,会早于上传中间件拦截大文件请求,导致后续逻辑不生效
现有方案修复步骤
- 调整
express-fileupload初始化配置:
const fileUpload = require('express-fileupload'); app.use(fileUpload({ limits: { fileSize: 100 * 1024 * 1024 }, // 全局100MB大小限制,提前拦截超限请求 useTempFiles: true, // 大文件写入临时磁盘,不占用内存 tempFileDir: './tmp', // 提前创建好该目录,给足读写权限 abortOnLimit: true // 超过大小直接终止请求,返回413错误 }));
- 调整express解析器的大小限制,需要放在路由注册前执行:
app.use(express.json({ limit: '150mb' })); app.use(express.urlencoded({ extended: true, limit: '150mb' }));
更稳定的替代实现
推荐使用express官方维护的multer中间件,大文件上传稳定性、社区生态都优于express-fileupload,直接在配置层面完成大小、格式校验,无需额外写业务判断:
const multer = require('multer'); // 配置磁盘存储路径、文件名规则 const storage = multer.diskStorage({ destination: (req, file, cb) => cb(null, './uploads/'), filename: (req, file, cb) => { const ext = file.mimetype.split('/')[1].toLowerCase(); cb(null, `${Date.now()}-${Math.random().toString(36).slice(2)}.${ext}`); } }); // 全局上传规则配置 const upload = multer({ storage, limits: { fileSize: 100 * 1024 * 1024 }, // 100MB大小限制 fileFilter: (req, file, cb) => { const ext = file.mimetype.split('/')[1].toLowerCase(); if (ext !== 'mp4') return cb(new Error('仅支持MP4格式视频')); cb(null, true); } }); // 路由使用示例 app.post('/upload/video', upload.single('video'), (req, res) => { // req.file 包含上传完成的文件所有信息 res.json({ code: 200, msg: '上传成功', filePath: req.file.path }); });
上传速度优化方案
- 前端分片上传:将视频切成2-5MB的分片并行上传,后端接收完成后合并文件,支持断点续传,避免网络波动导致全文件重传,大幅提升大文件上传成功率和速度
- 前端预压缩:上传前前端对视频进行分辨率、码率压缩,降低实际需要传输的文件体积
- 生产环境可对接对象存储服务的直传接口,无需经过后端服务转发,进一步降低传输链路耗时
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

