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


});

5 回复

好的,我将帮助你解决这个问题,并提供一些示例代码来解释如何正确地使用 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}%`);
  });
});

关键点解释

  1. 设置最大文件大小

    form.maxFileSize = 2 * 1024 * 1024; // 2MB
    

    这行代码用于限制上传文件的最大大小为 2MB。

  2. 错误处理

    • form.parse 中检查错误并输出。
    • form.on('error') 事件中处理错误。
  3. 文件类型检查

    • 检查上传文件的 MIME 类型,并根据类型决定文件扩展名。
  4. 文件重命名与移动

    • 使用 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 会触发错误事件。

回到顶部