gpt4 book ai didi

node.js - 从 Node 强大的文件上传访问原始文件流

转载 作者:IT老高 更新时间:2023-10-28 21:55:09 29 4
gpt4 key购买 nike

我正在创建一个应用程序,它需要上传一些文件并将它们直接发送到 S3。我什至不想在我的服务器上拥有 tmp 文件,所以我使用 Knox 模块并希望从 Formidable 获取原始流并通过 Knox 将其发送到 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 的默认行为是将部件写入文件。你不想要那个。您想要处理“部分”事件以写入 knox 下载。从这个开始:

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

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

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,则表示发送缓冲区已满。您应该暂停强大的解析器。当您从 Knox 流中获得 drain 事件时,您应该恢复 Formidable。

关于node.js - 从 Node 强大的文件上传访问原始文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860449/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com