避免进一步处理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'异步调用所以没有办法避免先运行文件写入脚本避免不必要的上传..
好吧,我实现了一个解决方案,也许是暂时的,但它似乎工作。如果文件大小超过要求,我将取消链接(删除)文件。然后我重定向到适当的错误页面。
这是一个解决方案,我在任何情况下都将文件写入磁盘,然后对文件进行错误检查。
文件的最大尺寸限制在打杂设定以确保,在文件系统中上传文件大小不跨的限制。
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;
}
});
});
但整个文件仍在上传。因此,有人可以上传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!");
}
});
});
由于使用打杂,我已经转移到使用multer ... – Vibhu