如何使套接字成为流?在图像魔术之后将 https 响应连接到 S3



我是节点和编程,我一直在为此苦苦挣扎......

我想获取 https 响应,使用 graphicsmagick 调整其大小并将其发送到我的 Amazon S3 存储桶。

看起来https res是一个IncomingMessage对象(我找不到任何关于它的信息),而graphicsmagick的stdout是一个Socket。

奇怪的是,我可以使用管道并将这两个发送到具有本地路径的 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()
    })
})

诺克斯 - 用于连接到 S3 – https://github.com/LearnBoost/knox图形魔术 - 用于图像处理 - https://github.com/aheckmann/gm

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

但是,由于我的图像相对较小,我发现缓冲优先于多部分上传。

我的解决方案:

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
        })
    })
})

您似乎正在从原始图像而不是调整大小的图像中设置内容长度

也许这有帮助

获取流的内容长度

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

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

相关内容

  • 没有找到相关文章

最新更新