12

busboyを使用して、アップロードしたファイルをバッファーに書き込み、そのファイルに対していくつかの検証 (幅、高さ、ファイルサイズ) を実行しています。アップロードに何か問題があることがわかったら、ストリームを中止/停止する方法を一生理解できません。

たとえば、許可したい最大ファイルサイズが 500kb の場合、アップロード中のバッファのサイズを追跡し、サイズが 500kb を超える場合は中止します。

これが私のコードの簡略版です。

var self = this;
var busboy = new Busboy({
    headers: self.req.headers,
    limits: {
        files: 1
    }
});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {

    file.fileRead = [];
    var size = 0;
    file.on('data', function(chunk) {

        size += chunk.length;

        /* DO VALIDATION HERE */
        if( size > 500000) {
            /*** ABORT HERE ***/
        }


        file.fileRead.push(chunk);
    });

    file.on('end', function() {
        var data = Buffer.concat(file.fileRead, size);
        // ... upload to S3
    });

    self.req.pipe(busboy);
});
4

5 に答える 5

6

わかりましたので、私は同じ問題を抱えていて、それを解決しましたfile.resume();

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

    // Validate file mimetype
    if(mimetype != 'image/png'){
        file.resume();
        return res.json({
            success: false,
            message: 'Invalid file format'
        });
    }

    // Upload
    fstream = fs.createWriteStream(__dirname + '/tmp/' + timestamp + filename);
    file.pipe(fstream);
    fstream.on('close', function () {
        return res.json({
            success: true
        });
    });

});

req.pipe(req.busboy);
于 2015-08-26T09:29:26.457 に答える
2

答えは簡単です。

// do the required validation like size check etc.
if( size > 500000) 
{
    self.req.unpipe();
    return;
}

文脈はこうです。busboy コードでは、busboy が WritableStream として実装されており、その下で、WritableStreamDicerとしても実装されている解析用のモジュールを使用していることがわかります。フローは次のようになります。

reqストリーム ==> busboy ==> dicer ==> dicer がイベントを発生させる ==> busboy がファイルでイベントを発生させる ==> これらのイベントはコードで消費されます。

このコードのフロー全体を停止するには、上記の unpipe を実行する必要があります。

于 2015-06-04T06:21:22.037 に答える
1

適切なことは、ソケットを閉じてリクエストを終了することだと思います

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

    file.fileRead = [];
    var size = 0;
    file.on('data', function(chunk) {

        size += chunk.length;

        /* DO VALIDATION HERE */
        if( size > 500000) {

            self.req.socket.end();
            self.res.end();

        }


        file.fileRead.push(chunk);
    });

    file.on('end', function() {
        var data = Buffer.concat(file.fileRead, size);
        // ... upload to S3
    });

    self.req.pipe(busboy);
});
于 2015-06-05T03:31:43.963 に答える
0

私はこのようなことを試してみます:

var self = this;
var busboy = new Busboy({
    headers: self.req.headers,
    limits: {
        files: 1,
        fileSize: 500000
    }
});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {

    file.fileRead = [];

    file.on('limit', function() {
        //Clear variables
    });

    file.on('data', function(chunk) {
        file.fileRead.push(chunk);
    });

    file.on('end', function() {
        var data = Buffer.concat(file.fileRead, size);
        // ... upload to S3
    });

    self.req.pipe(busboy);
});

基本的に、Busboy の設定に新しい制限を追加しました。fileSize: 500 * 1024

そして、制限イベントのリスニングを開始しました:

    file.on('limit', function() {
        //Clear vars
    });
于 2015-05-29T19:43:59.907 に答える
-1

基本的にファイルのアップロードを停止するメソッドをDicer持つ、基礎となるパーサーにアクセスできました。ignore

これが私がそれをした方法です:busboy._parser.parser._ignore()

それは非常にハックのように見えますが、機能し、まさに私が望んでいたことを行います.

于 2015-06-10T14:14:53.957 に答える