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

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

问题描述:

我想设置一个上传限制在busboy。没有上传限制,我可以成功上传文件。避免进一步处理busyboy文件上传大小限制

但是,当我想如果上传文件的大小超过规定重定向,我才知道的代码是异步的,文件或上传的写作发生反正。

我想要做的是,如果限达到配置的值,它应该重定向页面,而不上传文件。我曾尝试使用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(“数据” ...... busboy.on的(“文件” ...... 我得到不规则的文件大小上传文件系统上使用file.pipe 。

例如,这不是始终如一地工作(它示出了文件作为0字节时,其354字节或类似的):

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的除去file.on(“数据” .on('file'...流正确地写入磁盘,但然后无法检查文件大小是否超出DED ....

所以这个工作正常写入文件到文件系统......但我不能检查,如果文件大小超过允许的极限......

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'异步调用所以没有办法避免先运行文件写入脚本避免不必要的上传..

+0

由于使用打杂,我已经转移到使用multer ... – Vibhu

好吧,我实现了一个解决方案,也许是暂时的,但它似乎工作。如果文件大小超过要求,我将取消链接(删除)文件。然后我重定向到适当的错误页面。

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

文件的最大尺寸限制在打杂设定以确保,在文件系统中上传文件大小不跨的限制。

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

但整个文件仍在上传。因此,有人可以上传2GB,并且只有在完全上传后才会检查大小。我做的是: file.on('limit',function(){ fs.unlink ... }) –

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

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