Node.js和Requestjs : Pipe a Transform stream to Request. js作为文件进行上传

标签 node.js stream requestjs node-archiver

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

下面,我的转换流称为bridge。我没有对 Transform 做任何特别的事情(我相信它也可以是 PassThrough 流)。

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: content-length header required?

解决此问题的唯一方法是使用可读事件一次上传小块。不过,这需要您的目标 api 允许分块或分段上传。

关于Node.js和Requestjs : Pipe a Transform stream to Request. js作为文件进行上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35564232/

相关文章:

javascript - WebSockets 与 Node.js 和 socket.io

node.js - 抽象类型 Node 必须在运行时解析为字段 Root.node 的对象类型,值为\"\",收到\"null\"。”

javascript - npmjs 中是否存在 "Export as war"包?

javascript - Gulp 任务 - 无依赖性按顺序运行

Java流套接字只能发送一次

javascript - 如何替换返回的未定义值? (请求JS)

javascript - 在 ExpressJS 中将对象传递给 javascript

javascript - 通过 Azure API 管理流式传输

node.js - 如何使用请求将文件从 Node 发送到 Amazon S3?

node.js - 从 nodejs 请求到 s3 的流式响应