在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);
});
});
你再仔细看文档,maxFieldsSize
是单个表单域能够申请到的最大内存值,不是限定文件的大小。
实现这个功能,需要:
- 浏览器端提交表单前,检查文件大小是否超标,主要用到文件对象的size属性。如果还要支持低版本的IE,由于它们不支持size属性,需要使用ActiveXObject获取文件的大小。
- 服务器端接收文件的数据流时,计算文件大小,超出则停止接收,返回警告。
在 on progress中判断文件是否超出大小
form.on('progress', function (bytesReceived, bytesExpected) {
//在这里判断接受到数据是否超过最大,超过截断接受流
console.log(percent);
});
@snoopy 我看文档
- bytesReceived: 到目前為止,接收了總共多少byte的資料
- bytesExpected: 預期檔案案大小 那我是不是只要判断 bytesExpected,超过了就return?还是要判断bytesReceived?
另外在请教下,上传文件后文件已经被重命名了,这是不是唯一性的?如果是哪我还需要在重命名来避免覆盖吗?
@snoopy 好像我这样子依然是雾发截断的,请问需要怎么做?
form.on('progress', function (bytesReceived, bytesExpected) {
console.log(bytesReceived);
console.log(bytesExpected);
if (bytesExpected > 1024) {
return console.log('stop');
}
});
form.on('progress’, function (bytesReceived, bytesExpected) { console.log(bytesReceived); console.log(bytesExpected); }); 那你打印出来的值是什么
@coolicer 他先输出bytesReceived(目前接受到的大小),如何输出(预期大小),任何输出‘stop’,然后又开始输出bytesReceived,和bytesReceived,就这样一直执行下去。
@coolicer 嗯输出是正确的,7010254 6242304 7010254 6307840 7010254 6373376 7010254 6438912 7010254 6504448 7010254 6569984 7010254 6635520 7010254 6684672 7010254 6750208 7010254 6815744 7010254 6881280 7010254 6946816 7010254 7010254 7010254
@youqingkui 本来想写一个详细答案,不过stackoverflow上已经有这个问题的解答了:使用node-formidable,如何取消用户的上传
其实node-formidable
的文档中已经提及form.onPart
,所以说看文档要仔细。此外,除了调用成熟的程序库,有时也得读读它的源代码,了解工作原理。能写一篇详细的分析文档共享,就更棒了。
客户端也还是要同时加上检测文件大小的代码。想象一下,用户上传一个大文件,好一阵子,你才告诉他/她文件太大不接收了,他/她的表情会怎样?
共勉。
@youqingkui 根据获取的大小和你设定的最大值比,如果超过则触发error,然后你在error事件里去处理异常把
if( bytesReceived > maxByte){
that.emit('error', 'file too big!');
}