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



我正在尝试将上传从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();
}
由于打开 GridStore 文件

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

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

https://github.com/aheckmann/gridform

您可以将表单的处理代码移动到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();
}

相关内容

  • 没有找到相关文章

最新更新