要从 AWS Lambda 代理集成返回二进制媒体,请对来自 Lambda 函数的响应进行 base64 编码。还必须配置 API 的二进制媒体类型。负载大小限制为 10 MB。
要使用 Web 浏览器调用具有此示例集成的 API,请将 API 的二进制媒体类型设置为 */*
。API Gateway 使用来自客户端的第一个 Accept
标头来确定响应是否应返回二进制媒体。要在无法控制 Accept
标头值(如浏览器中的请求)的顺序时返回二进制媒体,请将 API 的二进制媒体类型设置为 */*
(对于所有内容类型)。
以下 Lambda 函数示例可以从 Amazon S3 返回二进制图像或将文本返回到客户端。该函数的响应包括一个 Content-Type
标头,用于向客户端指示它返回的数据类型。函数有条件地设置其响应中的 isBase64Encoded
属性,具体取决于它返回的数据类型。
- Node.js
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"
const client = new S3Client({region: 'us-east-2
'});
export const handler = async (event) => {
var randomint = function(max) {
return Math.floor(Math.random() * max);
}
var number = randomint(2);
if (number == 1){
const input = {
"Bucket" : "bucket-name
",
"Key" : "image.png
"
}
try {
const command = new GetObjectCommand(input)
const response = await client.send(command);
var str = await response.Body.transformToByteArray();
} catch (err) {
console.error(err);
}
const base64body = Buffer.from(str).toString('base64');
return {
'headers': { "Content-Type": "image/png" },
'statusCode': 200,
'body': base64body,
'isBase64Encoded': true
}
} else {
return {
'headers': { "Content-Type": "text/html" },
'statusCode': 200,
'body': "<h1>This is text</h1>",
}
}
}
- Python
import base64
import boto3
import json
import random
s3 = boto3.client('s3')
def lambda_handler(event, context):
number = random.randint(0,1)
if number == 1:
response = s3.get_object(
Bucket='bucket-name
',
Key='image.png'
,
)
image = response['Body'].read()
return {
'headers': { "Content-Type": "image/png" },
'statusCode': 200,
'body': base64.b64encode(image).decode('utf-8'),
'isBase64Encoded': True
}
else:
return {
'headers': { "Content-type": "text/html" },
'statusCode': 200,
'body': "<h1>This is text</h1>",
}
要了解有关二进制媒体类型的更多信息,请参阅 针对 API Gateway 中的 REST API 的二进制媒体类型。