2

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

我的目标是访问网关并在浏览器中提供并显示来自我的 S3 存储桶的图像。目前,我能够使用我的 lambda 中的 AWS SDK 从适当的存储桶中成功获取图像,这没问题。然后我通过网络发送它,响应为 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

作为旁注,我通过此代码提供的不仅仅是图像,但上面的示例只是一个图像。

4

1 回答 1

0

我能够找出解决我的问题的方法。感谢 jarmod 为我指明了正确的方向。我首先必须在我的 AWS 网关设置中为所有内容启用二进制媒体类型,如下图所示。

在此处输入图像描述

之后,我将 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;
于 2020-09-10T22:57:41.437 回答