使用lambda通过API网关提供存储桶图像资源会导致图像损坏

时间:2020-09-10 20:00:40

标签: javascript amazon-web-services amazon-s3 aws-lambda amazon-api-gateway

我正在使用AWS Api Gateway,Lambda和S3。

我的目标是访问网关,并在浏览器中提供和显示S3存储桶中的图像。目前,我可以使用lambda中的AWS开发工具包从相应的存储桶中成功获取图像,这没有问题。然后,我通过电线发送它,响应为200,我可以看到所有适当的标头。但是图像坏了。

这是我的lambda中的代码:

const AWS = require('aws-sdk');

const s3 = new AWS.S3();

exports.handler = async (event) => {
  const bucketParams = {
    Bucket: 'my-bucket',
    Key: 'build/cat.jpg',
  };
    
    const bucket = await s3.getObject(bucketParams).promise();
    
    const response = {
        statusCode: 200,
        body: Buffer.from(bucket.Body).toString(),
        headers: {
            'Accept-Ranges': 'bytes',
            'Content-Length': bucket.ContentLength,
            'Content-Type': bucket.ContentType,
            'Last-Modified': bucket.LastModified,
            'ETag': bucket.Etag,
        }
    };
    
    return response;
};

响应为200,一切正常,但我的图像在浏览器中似乎损坏了。这是示例https://3bn2t9npbd.execute-api.us-east-1.amazonaws.com/dev/cat.jpg

的uri

作为一个附带说明,尽管上面的示例只是一个图像,但我通过该代码提供的不仅仅是图像。

1 个答案:

答案 0 :(得分:0)

我能够找出解决问题的方法。感谢jarmod指出正确的方向。我首先必须为下图所示的AWS Gateway Settings中的所有内容启用Binary Media Types。

enter image description here

之后,我将lambda代码更改为:

const bucket = await s3.getObject(bucketParams).promise();
    
const response = {
  statusCode: 200,
  body: Buffer.from(bucket.Body).toString("base64"),
  headers: {
    'Accept-Ranges': 'bytes',
    'Content-Length': bucket.ContentLength,
    'Content-Type': bucket.ContentType,
    'Last-Modified': bucket.LastModified,
  },
  isBase64Encoded: true,
};
    
return response;