获取流的内容长度

15
在我的node.js应用中,我正在使用gm (一个Graphicsmagick封装器)aws2js (Amazon CLI封装器)。问题是亚马逊需要知道内容长度,以便我可以将流放在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) {
            .....       
            }
        });
    });
});

问题在于亚马逊需要知道内容长度(这不是库的问题),以便放置流。 AWS不支持分块流。

有谁知道如何确定流的内容长度?或者唯一的解决方案是将其暂时写入磁盘,以流的形式读取文件,然后使用临时文件的内容长度将其放入亚马逊中?


1
你最终解决了这个问题吗?我也在尝试做同样的事情... - Bill
1
Bill,我将结果缓冲并获取其大小。遗憾的是,没有其他方法可以做到这一点,因为亚马逊需要知道大小,而流就是一个流,没有固定的长度。 - japrescott
2个回答

2
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) {
      // .....       
    });
  });
});

1

这取决于您如何上传。我正在使用express.js,并从req.files对象中获取长度,例如:req.files.[file input name].length。

实际上,我也在尝试做同样的事情,但是我遇到了aws2js无法识别流的问题。如果您成功了,请告诉我。


一切都正常,如果我直接放置流(因为我已经得到了实际文件大小,我只是上传了)。但由于我正在调整大小,调整大小后的文件将具有不同的内容长度,我需要确定... 我会让你知道最新情况。 - japrescott
啊,我忘了那个。我需要做同样的事情。但是不知道为什么我从S3得到了一个400错误。 - jabbermonkey
我猜你可能正在使用express的Body Parser,这就是为什么你有一个“req.files”的可用性。在幕后,Body Parser实际上会先保存文件(这就是为什么你可以获得文件的大小),我相信这正是OP试图避免做的事情。你失去了直接将流传输到S3的优势。 - schankam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接