Javascript 获取一条流';s内容长度

Javascript 获取一条流';s内容长度,javascript,node.js,stream,amazon-s3,Javascript,Node.js,Stream,Amazon S3,在我的node.js应用程序中,我正在使用和。问题是Amazon需要知道内容长度,这样我才能将流放到S3上 我正在将图像上载到我的应用程序,通过创建流来读取该文件: var fileStream=fs.createReadStream(file.path) 我将该文件传递给gm,调整其大小,然后告诉它流式传输该文件。然后我想把这个流放到aws上: gm( fileStream, "some.png" ). identify(

在我的node.js应用程序中,我正在使用和。问题是Amazon需要知道内容长度,这样我才能将流放到S3上

我正在将图像上载到我的应用程序,通过创建流来读取该文件:

var fileStream=fs.createReadStream(file.path)
我将该文件传递给gm,调整其大小,然后告诉它流式传输该文件。然后我想把这个流放到aws上:

gm( fileStream, "some.png" ).                               
    identify({bufferStream: true}, function(err, info) {
        this.stream("png", function (err, stdout, stderr) {
            if (err){console.log(err);cb(err);return;}

            aws.S3.putStream(path, stdout, 'public-read', {'content-length': ?????, 'content-type': 'image/png'}, function (err, result) {
            .....       
            }
        });
    });
});
问题是Amazon需要知道内容长度(不是库)才能放入流。AWS不支持分块流


有人知道如何确定流的内容长度吗?或者唯一的解决方案是tmp将其写入磁盘,以流的形式读取文件,然后将其与临时文件的内容长度一起放入amazon?

这取决于您如何进行上传。我使用的是express.js,我从req.files对象中获取长度,就像这个req.files。[file input name].length


我实际上也在尝试做同样的事情,但是我在aws2js识别流时遇到了一个问题。如果你让它工作,请告诉我。

如果我直接放入流,一切都会工作(因为我已经得到了实际的文件大小,所以我刚刚上传)。但由于我正在调整大小,调整大小的文件将具有不同的内容长度,我需要对其进行修改。。我会告诉你的……啊,我忘了。我需要做同样的事情。出于某种原因,我从S3得到了一个400错误。我猜您可能在express中使用Body解析器,这就是为什么您有一个“req.files”可用。引擎盖下的Body解析器实际上会首先保存文件(这就是为什么您可以获得文件的大小),我相信这正是OP试图避免做的。您正在失去将流直接输送到S3的优势。您有没有想过这一点?我正试图做完全相同的事情…比尔;我缓冲结果并得到它的大小。可悲的是,没有其他方法可以做到这一点,因为亚马逊需要知道流的大小,并且流是好的-流-没有固定的长度。
gm( fileStream ).filesize({bufferStream: true}, function (error, filesize) {
  this.stream(function (error, stdout, stderr) {
    aws.S3.putStream(path, stdout, 'public-read', {'content-length': filesize, 'content-type': 'image/png'}, function (error, result) {
      // .....       
    });
  });
});