node-formidable 限制上传大小问题
发布于 10 年前 作者 youqingkui 10780 次浏览 最后一次编辑是 8 年前

在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);
  });


});
14 回复

你再仔细看文档maxFieldsSize是单个表单域能够申请到的最大内存值,不是限定文件的大小

实现这个功能,需要:

  • 浏览器端提交表单前,检查文件大小是否超标,主要用到文件对象的size属性。如果还要支持低版本的IE,由于它们不支持size属性,需要使用ActiveXObject获取文件的大小。
  • 服务器端接收文件的数据流时,计算文件大小,超出则停止接收,返回警告。

在 on progress中判断文件是否超出大小

form.on('progress', function (bytesReceived, bytesExpected) {
   //在这里判断接受到数据是否超过最大,超过截断接受流
    console.log(percent);
  });

@snoopy 我看文档

  1. bytesReceived: 到目前為止,接收了總共多少byte的資料
  2. bytesExpected: 預期檔案案大小 那我是不是只要判断 bytesExpected,超过了就return?还是要判断bytesReceived?

另外在请教下,上传文件后文件已经被重命名了,这是不是唯一性的?如果是哪我还需要在重命名来避免覆盖吗?

@bnuhero 原来是这样啊!谢谢!这个

form.parse(req, function (err, fields, files){});

里面的回调函数里面是不是可以判断上传成功?

@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,就这样一直执行下去。

@youqingkui 你直接看bytesExpected返回是不是正确的

@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

@bnuhero 现在不知道如何终止上传,有什么办法吗?谢谢!

@youqingkui 本来想写一个详细答案,不过stackoverflow上已经有这个问题的解答了:使用node-formidable,如何取消用户的上传

其实node-formidable的文档中已经提及form.onPart,所以说看文档要仔细。此外,除了调用成熟的程序库,有时也得读读它的源代码,了解工作原理。能写一篇详细的分析文档共享,就更棒了。

客户端也还是要同时加上检测文件大小的代码。想象一下,用户上传一个大文件,好一阵子,你才告诉他/她文件太大不接收了,他/她的表情会怎样?

共勉。

@bnuhero 嗯,十分感谢!因为英语不太好所以都是大意了解。

@youqingkui 根据获取的大小和你设定的最大值比,如果超过则触发error,然后你在error事件里去处理异常把

if( bytesReceived > maxByte){
    that.emit('error', 'file too big!');
}

@bnuhero 您好,您分享的stackoverflow链接,上面没有对 node-formidable 取消上传,做出明确的答复,只是问题的提问者,转而用 multr 了, 您有好的解决方法吗?

回到顶部