我正在尝试在 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 ' 被异步调用,因此无法避免首先运行文件写入脚本以避免不必要的上传..