Node.js和Requestjs:将一个Transformstream传递给Request.js作为上传文件

我正在使用node-archiver( https://github.com/archiverjs/node-archiver )在内存上创build一个zip文件。 使用存档器的pipe道function,我将所有内容都pipe理到一个转换stream。 如果需要,我可以将这个stream传给一个文件,但是我想让Request( https://github.com/request )读取这个stream,所以我不必去文件系统。

下面,我的转换stream被称为bridge 。 我没有做任何特殊的变换(我相信它也可能是一个PassThroughstream)。

 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部分是空的)。 但是,如果我pipe道我的桥转换stream到一个文件写入stream – 并在stream完成后 – 我创build一个阅读stream到该文件的表单文件操作,它的工作原理。 当然,因为现在我有一个完整的文件和request可以读取它(我不需要在这里桥,只是常规的fsstream)

 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需要读取stream成为一个文件stream – 还有什么我可以做错在这里。

我有一个类似的问题,发现这个问题既不是nodejs或requestjs。

这是HTTP的限制。 您不能上传没有已知内容长度的文件,在转换完成之前您无法从转换中获知这些文件。 看到这个: HTTP POST:content-length标题需要?

唯一可以通过一次性上传小块来解决这个问题的方法就是使用可读的事件。 但是,这将需要您的目标API允许分块或分段上传。

Interesting Posts