CNode

node-formidable 限制上传大小问题

Yyouqingkui发布于12 年前最后回复9 年前14 回复12038 浏览0 收藏

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

B
bnuhero#1·12 年前

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

实现这个功能,需要:

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

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

form.on('progress', function (bytesReceived, bytesExpected) {
   //在这里判断接受到数据是否超过最大,超过截断接受流
    console.log(percent);
  });
Y
youqingkui#3·12 年前
引用 DoubleSpout在 on progress中判断文件是否超出大小 form.on('progress', function (bytesReceived, bytesExpected) { //在这里判断接受...

@snoopy 我看文档

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

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

Y
youqingkui#4·12 年前
Y
youqingkui#5·12 年前
引用 DoubleSpout在 on progress中判断文件是否超出大小 form.on('progress', function (bytesReceived, bytesExpected) { //在这里判断接受...

@snoopy 好像我这样子依然是雾发截断的,请问需要怎么做?

  form.on('progress', function (bytesReceived, bytesExpected) {
    console.log(bytesReceived);
    console.log(bytesExpected);
    if (bytesExpected > 1024) {
      return console.log('stop');
    }
  });
C
coolicer#6·12 年前

form.on('progress', function (bytesReceived, bytesExpected) { console.log(bytesReceived); console.log(bytesExpected); }); 那你打印出来的值是什么

Y
youqingkui#7·12 年前
引用 coolicerform.on('progress', function (bytesReceived, bytesExpected) { console.log(bytesReceived); consol...

@coolicer 他先输出bytesReceived(目前接受到的大小),如何输出(预期大小),任何输出‘stop’,然后又开始输出bytesReceived,和bytesReceived,就这样一直执行下去。

C
coolicer#8·12 年前
Y
youqingkui#9·12 年前
引用 coolicerform.on('progress', function (bytesReceived, bytesExpected) { console.log(bytesReceived); consol...

@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

B
bnuhero#11·12 年前
引用 bnuhero你再仔细看文档,maxFieldsSize 是单个表单域能够申请到的最大内存值, 不是限定文件的大小 。 实现这个功能,需要: + 浏览器端提交表单前,检查文件大小是否超标,主要用到文件对象的...

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

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

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

共勉。

D
DoubleSpout#13·12 年前
引用 DoubleSpout在 on progress中判断文件是否超出大小 form.on('progress', function (bytesReceived, bytesExpected) { //在这里判断接受...

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

if( bytesReceived > maxByte){
    that.emit('error', 'file too big!');
}
H
hugeorange#14·9 年前
引用 bnuhero@youqingkui 本来想写一个详细答案,不过stackoverflow上已经有这个问题的解答了:使用node formidable,如何取消用户的上传 其实node formidable...

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

参与回复
登录后即可参与回复。登录