3

我正在尝试在 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;

在这里,我将文件大小限制指定为 30 MB。但是当我上传一个 40 MB 的文件时,我仍然在控制台中得到“TWOO”,然后是“ONEEE”……这显然是由于这是异步发生,那么解决方案是什么......?

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


另外,如果我尝试检查内部 file.on('data' ... of busboy.on('file' ... 我在使用 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);
      });

    });

虽然,如果我从 busboy.on('file' 内部删除 file.on('data' ...流被正确写入磁盘,但是没有办法检查文件大小是否超过...。

所以这可以正常工作以将文件写入文件系统......但我无法检查文件大小是否超过允许的限制......

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

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

4

2 回答 2

3

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

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!");
      }
    });
 });
于 2016-11-03T21:45:36.770 回答
0

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

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

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

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

  fstream.on('close', function () {
    var stat = fs.statSync("/home/vibs/new_stream.txt");
    var fileSizeInBytes = stat["size"];

    if(fileSizeInBytes>30000000){
      fs.unlink("/home/vibs/new_stream.txt");
      res.redirect('/error_uploding');
      return;
    }
  });
});
于 2016-09-25T10:34:32.250 回答