我有一个节点 js 项目,它需要在发送到客户端之前减小图像的大小。我正在使用请求库和尖锐库。
图像的来源是签名的 aws s3 存储桶 url - 例如
{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 获取上面的 url,调整它的大小,然后将调整大小的图像发送回客户端
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})
}
})
}
在上述调用中,
该 url 是在几分钟前签署并公开的,console.log({body}) 的结果是二进制数据,这是应该返回的,
第一个 console.log({error}) 为空。
问题出在 console.log({err}) 的位置,它显示 -
{ err: Error: Input buffer contains unsupported image format }
我在 s3 上有另一个存储桶,如果我在该存储桶上获取公共图像的 url(未签名的 url)并执行 -
....
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,并且出现了相同的错误消息。看来请求正在返回正确的响应。