如何使用Formidable将文件上传直接传输到Mongo的GridFS?

时间:2012-05-06 08:59:02

标签: node.js mongodb file-upload stream

我正在尝试将上传从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();
}

此外,商店实例化和打开应该以某种方式放在onPart中。

亚历

2 个答案:

答案 0 :(得分:3)

由于打开GridStore文件是异步并且没有强大的功能,因此您需要在等待GridStore文件打开时对强大的传入流进行一些手动缓冲。由于GridFS无法通过管道传输,因此需要在打开后手动将每个缓冲的块写入GridStore。

刚刚发布的gridform应该可以满足您的需求。

https://github.com/aheckmann/gridform

答案 1 :(得分: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();
}