避免进一步处理busyboy文件上传大小限制

时间:2016-09-24 23:37:38

标签: node.js express upload limit busboy

我试图在busboy中设置上传限制。没有上传限制,我可以成功上传文件。

但是当我想重定向上传文件大小超过要求时,我意识到代码是异步的,无论如何都要写文件或上传。

我想要做的是,如果限制达到配置值,它应该重定向到页面而不上传文件。我尝试过使用Javasript Promise,但它没有帮助。

我的busboy代码是这样的。

var express = require('express');
var router = express.Router();
var inspect = require('util').inspect;
var Busboy = require('busboy');

router.all('/', function(req, res, next) {

if (req.method === 'POST') {
  var busboy = new Busboy({ headers: req.headers, limits: { files: 1, fileSize: 30000000 }  });

  busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
    file.on('limit', function(data) {
      console.log("limit...");
      console.log("ONEEE");
    });
    console.log("TWOOO");
    console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);

    file.on('data', function(data) {
      console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
    });
    file.on('end', function() {
      console.log('File [' + fieldname + '] Finished');
    });
  });

  busboy.on('finish', function() {
    console.log('Done parsing form!');
    res.writeHead(303, { Connection: 'close', Location: '/test_upload' });
    res.end();
  });
  req.pipe(busboy);
}
});

module.exports = router;

这里我已经将fileSize限制指定为30 MB ..但是当我上传一个40 MB的文件时,我仍然会得到" TWOO"在控制台然后" ONEEE" ...这显然是由于这是异步发生的原因,那么解决方案是什么......?

基本上,如果达到限制,我想记录" ONEEE"并重定向,避免记录" TWOOO"到控制台并避免文件处理。

此外,如果我尝试检查内部file.on('数据' ... busboy.on('文件' ... 我使用file.pipe在文件系统上获得不规则的文件大小上传。

例如,这不能一致地工作(当它的354字节或类似文件时,它将文件显示为0字节):

busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      file.on('data', function(data){
        fstream = fs.createWriteStream("/home/vibs/temp_01.txt");
        file.pipe(fstream);
      });

    });

虽然,如果我删除file.on('数据'来自busboy.on('文件' ... ...正确地将流写入磁盘,但是然后有无法检查文件大小是否超过....

所以这样可以正确地将文件写入文件系统......但我无法检查文件大小是否超出允许限制...

busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
  fstream = fs.createWriteStream("/home/vibs/temp_01.txt");
  file.pipe(fstream);
});

所以我的问题是如何在不执行上传程序的情况下检查文件大小限制和重定向... file.on('数据' ...因为流在函数内部损坏而失败... 。而file.on(' limit'被异步调用,所以没有办法避免先运行文件写脚本,避免不必要的上传..

2 个答案:

答案 0 :(得分:2)

如果文件达到最大尺寸,这将停止上传。

var fstream;
req.pipe(req.busboy);

req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {

  var path = __dirname + "/../public/";
  var limit_reach = false;
  var limit_reach_err = "File is too large!";

  // Creating a writestream using fs module
  fstream = fs.createWriteStream(path);
  file.pipe(fstream);


   // If the file is larger than the set limit
   // delete partially uploaded file 
   file.on('limit', function(){
     fs.unlink(path, function(){ 
       limit_reach = true;
       res.status(455).send(limit_reach_err);
      });
    });

    // Despite being asynchronous limit_reach 
    // will be seen here as true if it hits max size 
    // as set in file.on.limit because once it hits
    // max size the stream will stop and on.finish
    // will be triggered.
    req.busboy.on('finish', function() {
      if(!limit_reach){
        res.send("Image saved successfully!");
      }
    });
 });

答案 1 :(得分:0)

好的,我已经实施了一个解决方案,也许是一个临时解决方案,但似乎有效。如果文件在磁盘上的大小超过要求,我将取消链接(删除)该文件。然后我重定向到适当的错误页面。

这是一个解决方案,我在任何情况下都将文件写入磁盘,然后对文件进行错误检查。

在busboy中设置了最大的fileSize限制,以确保文件系统上传的文件大小不会超限。

public MidiFile(File fileIn) throws FileNotFoundException, IOException
    {
        this(new FileInputStream(fileIn));
    }