Nodejs node-formidable 限制上传大小问题
Nodejs node-formidable 限制上传大小问题
在node-formidable上的文档看到可以这样来限制上传大小
form.maxFieldsSize = 2 * 1024 * 1024;
但是我代码这样子写,依旧是没有限制到上传的大小,现在不管多大都能上传。求指导。谢谢!
router.post('/up', function (req, res) {
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = 'public/images/';
form.keepExtensions = true;
form.maxFieldsSize = 2 * 1024;
console.log(form);
form.parse(req, function (err, fields, files) {
console.log(fields);
console.log(files);
if (err) {
return console.log(err);
}
var extName = '';
switch (files.img.type) {
case 'image/pjpeg':
extName = 'jpg';
break;
case 'image/jpeg':
extName = 'jpg';
break;
case 'image/png':
extName = 'png';
break;
case 'image/x-png':
extName = 'png';
break;
}
if (extName.length == 0) {
// return console.log("no img");
}
var imgName = uuid.v1() + extName;
var newPath = form.uploadDir + imgName;
console.log(newPath);
fs.renameSync(files.img.path, newPath);
console.log("ok");
res.end(util.inspect({fields: fields, files: files}));
});
form.on('fileBegin', function (name, value) {
console.log('....');
console.log(name);
console.log('....');
console.log(value);
});
form.on('end', function () {
console.log("en");
});
form.on('error', function (err) {
console.log(err);
console.log("error");
});
form.on('file', function (name, file) {
console.log("```````");
console.log(name);
console.log(file);
});
form.on('progress', function (bytesReceived, bytesExpected) {
var percent = Math.floor(bytesReceived / bytesExpected * 100);
console.log(percent);
});
});
好的,我将帮助你解决这个问题,并提供一些示例代码来解释如何正确地使用 node-formidable
来限制文件上传的大小。
问题分析
在你的代码中,form.maxFieldsSize
设置的是字段(即表单中的输入框)的最大大小,而不是文件上传的最大大小。因此,你需要设置 form.maxFileSize
来限制文件上传的大小。
解决方案
首先,确保你已经安装了 formidable
:
npm install formidable
然后,修改你的代码以正确设置文件上传的最大大小:
const formidable = require('formidable');
const fs = require('fs');
const util = require('util');
const uuid = require('uuid');
router.post('/up', function (req, res) {
const form = new formidable.IncomingForm();
// 设置编码
form.encoding = 'utf-8';
// 设置上传目录
form.uploadDir = 'public/images/';
// 保持扩展名
form.keepExtensions = true;
// 设置文件最大大小为 2MB
form.maxFileSize = 2 * 1024 * 1024; // 2MB
form.parse(req, function (err, fields, files) {
if (err) {
return console.error(err);
}
console.log(fields);
console.log(files);
let extName = '';
switch (files.img.type) {
case 'image/pjpeg':
case 'image/jpeg':
extName = 'jpg';
break;
case 'image/png':
case 'image/x-png':
extName = 'png';
break;
}
if (!extName) {
return console.error("Unsupported image type");
}
const imgName = uuid.v1() + '.' + extName;
const newPath = form.uploadDir + imgName;
try {
fs.renameSync(files.img.path, newPath);
console.log("File uploaded successfully.");
res.end(util.inspect({ fields, files }));
} catch (err) {
console.error("Error moving file:", err);
res.status(500).send("Internal Server Error");
}
});
form.on('fileBegin', function (name, value) {
console.log(`Uploading ${value.name}...`);
});
form.on('file', function (name, file) {
console.log(`File uploaded: ${file.name}`);
});
form.on('error', function (err) {
console.error("Upload error:", err);
res.status(500).send("Upload failed");
});
form.on('progress', function (bytesReceived, bytesExpected) {
const percent = Math.floor((bytesReceived / bytesExpected) * 100);
console.log(`Progress: ${percent}%`);
});
});
关键点解释
-
设置最大文件大小:
form.maxFileSize = 2 * 1024 * 1024; // 2MB
这行代码用于限制上传文件的最大大小为 2MB。
-
错误处理:
- 在
form.parse
中检查错误并输出。 - 在
form.on('error')
事件中处理错误。
- 在
-
文件类型检查:
- 检查上传文件的 MIME 类型,并根据类型决定文件扩展名。
-
文件重命名与移动:
- 使用
fs.renameSync
将临时文件移动到指定路径。
- 使用
通过这些修改,你应该能够成功限制文件上传的大小。如果上传的文件超过设定的最大大小,formidable
会抛出错误,你可以在 form.on('error')
事件中捕获并处理这个错误。
你再仔细看文档,maxFieldsSize
是单个表单域能够申请到的最大内存值,不是限定文件的大小。
实现这个功能,需要:
- 浏览器端提交表单前,检查文件大小是否超标,主要用到文件对象的size属性。如果还要支持低版本的IE,由于它们不支持size属性,需要使用ActiveXObject获取文件的大小。
- 服务器端接收文件的数据流时,计算文件大小,超出则停止接收,返回警告。
在 on progress中判断文件是否超出大小
form.on('progress', function (bytesReceived, bytesExpected) {
//在这里判断接受到数据是否超过最大,超过截断接受流
console.log(percent);
});
form.on(‘progress’, function (bytesReceived, bytesExpected) { console.log(bytesReceived); console.log(bytesExpected); }); 那你打印出来的值是什么
在使用 node-formidable
时,maxFieldsSize
属性是用来限制所有字段的大小,而不是单个文件的大小。如果你想要限制单个文件的大小,你需要设置 maxFileSize
属性。
以下是修改后的代码示例:
router.post('/up', function (req, res) {
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = 'public/images/';
form.keepExtensions = true;
form.maxFileSize = 2 * 1024 * 1024; // 设置单个文件的最大大小为 2MB
form.parse(req, function (err, fields, files) {
if (err) {
return console.log(err);
}
// 文件处理逻辑...
});
// 其他事件监听器...
});
通过设置 maxFileSize
属性,你可以限制单个文件的最大大小。在这个例子中,设置为 2MB。如果上传的文件超过这个大小,node-formidable
会触发错误事件。