4

我一般是节点和编程,我一直在努力解决这个问题......

我想接受 https 响应,使用 graphicsmagick 调整大小并将其发送到我的亚马逊 S3 存储桶。

看来 https res 是一个 IncomingMessage 对象(我找不到任何关于它的信息),而 graphicsmagick 的标准输出是一个套接字。

奇怪的是,我可以使用管道并将它们发送到具有本地路径的 writeStream,并且 res 和 stdout 都创建了一个很好的新调整大小的图像。

我什至可以将 res 发送到 S3(使用 knox)并且它可以工作。

但标准输出不想去 S3 :-/

任何帮助,将不胜感激!

https.get(JSON.parse(queryResponse).data.url,function(res){

    var headers = {
        'Content-Length': res.headers['content-length']
        , 'Content-Type': res.headers['content-type']
    }

    graphicsmagick(res)
      .resize('50','50')
      .stream(function (err, stdout, stderr) {

        req = S3Client.putStream(stdout,'new_resized.jpg', headers, function(err, res){
        })
        req.end()
    })

})

knox - 用于连接到 S3 - https://github.com/LearnBoost/knox graphicsmagick - 用于图像处理 - https://github.com/aheckmann/gm

4

3 回答 3

4

问题在于亚马逊需要事先知道内容长度(感谢 DarkGlass)

但是,由于我的图像相对较小,我发现缓冲优先于 MultiPartUpload。

我的解决方案:

https.get(JSON.parse(queryResponse).data.url,function(res){

    graphicsmagick(res)
      .resize('50','50')
      .stream(function (err, stdout, stderr) {

        ws. = fs.createWriteStream(output)

        i = []

        stdout.on('data',function(data){
          i.push(data)
        })

        stdout.on('close',function(){
          var image = Buffer.concat(i)

          var req = S3Client.put("new-file-name",{
             'Content-Length' : image.length
            ,'Content-Type' : res.headers['content-type']
          })

          req.on('response',function(res){  //prepare 'response' callback from S3
            if (200 == res.statusCode)
              console.log('it worked')
          })
          req.end(image)  //send the content of the file and an end
        })
    })
})
于 2013-02-04T22:37:55.230 回答
2

您似乎是从原始图像设置 Content-Length 而不是调整大小的图像

也许这有帮助

获取流的内容长度

https://npmjs.org/package/knox-mpu

于 2013-02-04T17:25:57.277 回答
0

你不应该在req.end()那里做。通过这样做,您将在 S3 有时间发送图像数据之前关闭流。end发送完所有图像数据后,它会自动自动执行。

于 2013-02-04T06:25:48.630 回答