大家好,我是 Immerse,一名独立开发者、内容创作者、AGI实践者。
https://yaolifeng.com
也同步更新。我会在这里分享关于编程
、独立开发
、AI
、出海
、个人思考
等内容。
如果本文对你有帮助,欢迎动动小手指一键三连(点赞
、评论
、转发
),给我一些支持和鼓励,谢谢!
Node.js 文件上传的两大主流方案:Multer 和 Formidable 对比
Multer 就像是 Express 框架的专属管家,专门负责处理 multipart/form-data
格式的文件上传。它基于 busboy 构建,最大的优势就是使用简单,3 行代码就能搞定基础上传功能。
核心特点:
适用场景:
Formidable 更像是一个专业的文件处理专家,不仅支持 Express,还能在 Koa、原生 Node.js 等各种环境中使用。最厉害的是它的性能:在基准测试中达到了 2566 MB/秒 的处理速度!
核心特点:
适用场景:
const multer = require('multer');
const path = require('path');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/'); // 确保目录存在
},
filename: function (req, file, cb) {
// 生成唯一文件名,避免冲突
cb(null, Date.now() + '-' + Math.round(Math.random() * 1e9) + path.extname(file.originalname));
},
});
const upload = multer({
storage: storage,
limits: {
fileSize: 10 * 1024 * 1024, // 10MB 限制
files: 5, // 最多5个文件
},
fileFilter: (req, file, cb) => {
// 只允许图片上传
if (file.mimetype.startsWith('image/')) {
cb(null, true);
} else {
cb(new Error('只允许上传图片文件!'), false);
}
},
});
const formidable = require('formidable');
const form = formidable({
uploadDir: './uploads',
keepExtensions: true, // 保留文件扩展名
maxFileSize: 50 * 1024 * 1024, // 50MB
maxFiles: 10, // 最多10个文件
maxTotalFileSize: 100 * 1024 * 1024, // 总大小限制
filter: function ({ name, originalFilename, mimetype }) {
// 过滤不安全的文件类型
return mimetype && mimetype.includes('image');
},
});
配置要点解析:
根据实际测试数据:
这意味着如果你需要处理大量文件上传,Formidable 的性能优势非常明显。一个 100MB 的视频文件,Formidable 可以在几秒内处理完成,而 Multer 可能需要更长时间。
必须设置的安全参数:
错误处理示例:
// Multer 错误处理
app.use((err, req, res, next) => {
if (err instanceof multer.MulterError) {
if (err.code === 'LIMIT_FILE_SIZE') {
return res.status(400).json({ error: '文件太大了!' });
}
}
next(err);
});
记住:没有最好的工具,只有最适合的选择。
根据项目实际需求来决定,不要盲目追求性能而忽略团队的技术栈熟悉度。