node.js – 从节点强大的文件上传访问原始文件流

我创建一个应用程序,需要一些文件上传,并直接发送到S3。我不想在我的服务器上甚至没有tmp文件,所以我使用的Knox模块,并希望从Formidable的原始流,并通过诺克斯发送到S3。我使用Knox做了类似的事情使用这段代码下载一个文件:

knox.downloads.get(widget.download).on('response',function(sres){
    res.writeHead(200, {
        'Content-Type':'application/zip',
        'Content-Length': sres.headers['content-length'],
        'Content-Disposition':'attachment; filename=' + widget.download
    });
    util.pump(sres, res);
}).end();

现在我想做相似的方向(从浏览器文件上传到S3)。

到目前为止,我已经写了一个事件处理程序来捕获文件中的每个数据,因为它上传:

var form = new formidable.IncomingForm();
form.onPart = function(part){
    if(!part.filename){
        form.handlePart(part);
    }else{
        if(part.name == 'download'){
            // Upload to download bucket
            controller.putDownload(part);
        }else{
            // Upload to the image bucket
            controller.putImage(part);
        }
        //res.send(sys.inspect(part));
    }
}
form.parse(req, function(err, fields, files){
    if(err){
        res.json(err);
    }else{
        res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'});
        //controller.createWidget(res,fields,files);            
    }
});


controller.putDownload = function(part){
    part.addListener('data', function(buffer){
        knox.download.putStream(data,part.filename, function(err,s3res){
            if(err)throwError(err);
            else{
                console.log(s3res);
            }
        });
    })
    knox.downloads.putStream(part, part.filename, function(err,s3res){

        if(err)throwError(err);
        else{
            console.log(s3res);
        }
    });
}

但是数据事件只给我缓冲区。那么是否可以捕获流本身并推送到S3?

最佳答案
你想要做的是覆盖Form.onPart方法:

IncomingForm.prototype.onPart = function(part) {
  // this method can be overwritten by the user
  this.handlePart(part);
};

Formidable的默认行为是将部分写入文件。你不想要的。你想处理’part’事件写入knox下载。开始:

form.onPart = function(part) {
    if (!part.filename) {
        // let formidable handle all non-file parts
        form.handlePart(part);
        return;
    }

然后打开knox请求并自己处理raw部分事件:

part.on('data', function(data) {
    req.write(data);
});
part.on('end', function() {
    req.end();
});
part.on('error', function(err) {
    // handle this too
});

作为奖励,如果req.write(data)返回false,表示发送缓冲区已满。您应该暂停Formidable解析器。当你从诺克斯流中得到排水事件时,你应该恢复可怕的。

转载注明原文:node.js – 从节点强大的文件上传访问原始文件流 - 代码日志