Node.js 和 Requestjs:将转换流通过管道传输到 Request.js 作为上传文件



我正在使用节点存档器(https://github.com/archiverjs/node-archiver)在内存上创建一个zip文件。使用存档器的管道功能,我将所有内容通过管道传输到转换流。如果需要,我可以将此流通过管道传输到文件,但我想让请求(https://github.com/request)读取此流,因此我不必访问文件系统。

下面,我的转换流称为 bridge 。我没有在转换上做任何特别的事情(我相信它也可能是直通流)。

var archive = archiver('zip');
archive.pipe(bridge);
var r = request.post(url, function(err, res, body){ .... }
var form = r.form();
form.append('token', <some token>);
form.append('file', bridge, { "filename" : "package.zip", "contentType" : "application/zip" });
archive.append(<some string>, { "name": <some file name> });
archive.finalize();

这不起作用(似乎file部分是空的)。但是,如果我通过管道将桥转换流传输到文件写入流 - 并且在流完成后 - 我在表单文件操作中创建该文件的读取流,它可以工作。当然,因为现在我有一个完全成型的文件,request可以读取它(我在这里不需要桥接,只需要常规的fs流)

bridge.pipe(fs.createWriteStream(<myfile>));
var archive = archiver('zip');
archive.pipe(bridge);
bridge.on("finish", function(){
    var r = request.post(url, function(err, res, body){ .... }
    var form = r.form();
    form.append('token', <some token>);
    form.append('file', fs.createReadStream(<myfile>), { "filename" : "package.zip", "contentType" : "application/zip" });
}
archive.append(<some string>, { "name": <some file name> });    
archive.finalize();

我想知道request是否要求读取流是文件流 - 以及我在这里可能做错了什么。

我有一个类似的问题,发现问题既不在于nodejs也不在于requestjs。

这是 HTTP 的一个限制。您无法上传没有已知内容长度的文件,在转换完成之前无法从转换中知道该长度。 看到这个: HTTP POST:是否需要内容长度标头?

解决此问题的唯一方法是一次上传具有可读事件的小块。但是,这需要您的目标 API 允许分块或分段上传。

最新更新