4

Formidable から Mongo の GridFS に直接アップロードをストリーミングしようとしています。

データを書き込む前に GridStore を開く必要がありますが、ストアを開くのに時間がかかるため、すでに解析されていないデータが多すぎて失敗します。

GridStore を準備して、着信アップロードを処理するにはどうすればよいですか?

function upload (request, response, next, options) {
    var form = new Formidable.IncomingForm();

    var store = new Mongo.GridStore(options.mongoose.connection.db, new ObjectID, 'w+', {
        root: 'store',
        chunk_size: 1024 * 64
    } );

    form.onPart = function (part) {
        if(!part.filename){
            form.handlePart(part);
            return;
        }

        part.on('data', function(buffer){
            store.write(buffer);
        });

        part.on('end', function() {
            store.close();
        });
    };

    store.open( function (error, store) {
        form.parse(request);
    });

    response.send();
}
4

2 に答える 2

3

GridStore ファイルを開くのは非同期であり、手ごわいものはそうではないため、GridStore ファイルが開くのを待つ間、手ごわい受信ストリームを手動でバッファリングする必要があります。GridFS はパイプできないため、バッファリングされた各チャンクを GridStore を開いた後に手動で書き込む必要があります。

リリースされたばかりgridformで、必要なことを行う必要があります。

https://github.com/aheckmann/gridform

于 2012-05-07T18:05:08.577 に答える
1

store.openたとえば、フォームの処理コードをコールバックに移動できます。

function upload (request, response, next, options) {

    var store = new Mongo.GridStore(options.mongoose.connection.db, new ObjectID, 'w+', {
        root: 'store',
        chunk_size: 1024 * 64
    } );


    store.open( function (error, store) {
        var form = new Formidable.IncomingForm();
        form.onPart = function (part) {
            if(!part.filename){
                form.handlePart(part);
                return;
            }

            part.on('data', function(buffer){
                store.write(buffer);
            });

            part.on('end', function() {
                store.close();
            });
        };
        form.parse(request);
    });

    response.send();
}
于 2012-07-21T16:18:19.570 に答える