错误:使用请求库下载签名的aws s3图像并传递给Sharp时,输入缓冲区包含不受支持的图像格式

时间:2019-08-13 22:36:03

标签: node.js amazon-web-services amazon-s3 node-modules sharp

我有一个节点js项目,需要在发送到客户端之前减小图像的大小。我正在使用request库和sharp库。

图片的来源是经过签名的aws s3存储桶网址-例如

{http://my_intentionally_hidden_url/api/getImage?image=https://my_intentionally_hidden_bucket_name_and_path.s3.eu-central-1.amazonaws.com/name_it/q_i_9.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=My_intentionally_hidden_credentials%2F20190813%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20190813T221026Z&X-Amz-Expires=120&X-Amz-Signature=1c81c2b69d82e116d8ea398604b44dfb3ca2bb7d9b961d639766630fe4b4eb95&X-Amz-SignedHeaders=host&width=1440&height=120}

我正在使用以下代码块从s3中获取aboove网址,调整其大小,然后将调整后的图像发送回客户端

module.exports.getImage = (req,res) => {
  const url = req.query.image; //the signed url
  var width = parseInt(req.query.width);
  var height = parseInt(req.query.height);

  if(width > 300){
      width = 300;
  }

  if(height > 300){
      height = 300;
  }

  request({url, encoding: null }, (error, response, body ) => {
      console.log({body});
      console.log({error});


      if(!error) {
         sharp(body)
            .resize (width,height)
            .webp({ lossless: false })
            .toBuffer()
            .then(data => {
                console.log("we we we")
                return res.send(data);
                console.log({data});
            })
            .catch(err => {
                console.log({err})
            })

      }
      else{
          console.log({error})
      }
   })
}

在上述通话中,

几分钟前已对该网址进行了签名以将其公开,console.log({body})的结果是二进制数据,应返回该值,

第一个console.log({error})为空。

问题是console.log({err})在哪里,它显示-

{ err: Error: Input buffer contains unsupported image format }

我在s3上有另一个存储桶,如果我在该存储桶上获取了公共映像的网址(未签名的网址),然后执行-

 ....
 const url = "https://My_hidden_bucket_name.s3-eu-west-1.amazonaws.com/o_d_3.jpg"
 var width = parseInt(req.query.width);
 var height = parseInt(req.query.height);
 ....

我确信签名的url可以正常工作,因为从客户端调用签名的url并对其进行了测试,并且图像显示出来了。

我尝试使用不带.webp()的Sharp进行测试,结果相同,我将它与Sharp提供的其他格式一起使用-jpeg,png和出现相同的错误消息。似乎请求正在返回正确的响应。