【问题标题】:get a stream's content-length获取流的内容长度
【发布时间】:2012-02-11 13:51:21
【问题描述】:

在我的 node.js 应用程序中,我使用的是 gm (a graphicsmagick wrapper)aws2js (amazon cli wrapper)。问题是亚马逊需要知道内容长度,以便我可以将流放在 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 不支持分块流。

有谁知道我如何确定流的内容长度?还是唯一的解决方案是将 tmp 写入磁盘,将文件作为流读取,然后使用临时文件的内容长度将其放入亚马逊?

【问题讨论】:

  • 你有没有想过这个问题?我正在尝试做完全相同的事情......
  • 比尔;我缓冲结果并获取它的大小。可悲的是,没有其他方法可以做到这一点,因为亚马逊需要知道大小并且流很好 - 流 - 没有固定长度。

标签: javascript node.js stream amazon-s3


【解决方案1】:
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) {
      // .....       
    });
  });
});

【讨论】:

    【解决方案2】:

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

    我实际上正在尝试做同样的事情,但我在 aws2js 识别流时遇到了问题。让我知道你是否能正常工作。

    【讨论】:

    • 一切正常,如果我直接放流(因为我有实际的文件大小,我刚刚上传)。但是由于我正在调整大小,调整后的文件将具有不同的内容长度,我需要确定..我会及时通知你..
    • 啊,我忘了。我需要做同样的事情。由于某种原因,我从 S3 收到 400 错误。
    • 我猜你可能正在使用带有 express 的 Body Parser,这就是为什么你有一个“req.files”可用的原因。引擎盖下的 Body Parser 实际上会首先保存文件(这就是为什么你可以获得文件的大小),我相信这是 OP 试图避免做的事情。您正在失去将流直接传输到 S3 的优势。
    猜你喜欢
    • 2022-07-02
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多