如何通过 API Gateway 将图像或 PDF 文件上传到 Amazon S3?

上次更新日期:2022 年 12 月 20 日

我想通过 Amazon API Gateway 将图像或 PDF 文件上传到 Amazon Simple Storage Service(Amazon S3)。我还想检索图像或 PDF 文件。我该如何执行这些操作?

简短描述

要使用 API Gateway 将图像或 PDF 文件作为二进制文件上传到 S3 存储桶,请使用 API Gateway 激活二进制支持

要授予 API 对 S3 存储桶的访问权限,您需要创建一个 AWS Identity and Access Management(IAM)角色。该 IAM 角色必须包含可让 API Gateway 在您的 S3 存储桶上执行 PutObjectGetObject 操作的权限。

解决方法

为 API Gateway 创建一个 IAM 角色

1.    打开 IAM console(IAM 控制台)。

2.    在导航窗格中,选择角色

3.    选择 Create Role(创建角色)。

4.    在选择受信任实体的类型部分,选择 AWS 服务

5.    在 Choose a use case(选择一个使用案例)部分,选择 API Gateway

6.    在 Select your use case(选择您的使用案例)部分,选择 API Gateway

7.    选择 Next: Permissions(下一步:权限)。

注意:这一部分会显示允许 API Gateway 将日志推送到用户账户的 AWS 托管服务。稍后您将为 Amazon S3 添加权限。现在选择 Next: Tags(下一步:标签)。

8.    添加标签(可选),然后选择 Next: Review(下一步:审核)。

9.    对于 Role name(角色名称),为您的角色输入一个名称。例如:api-gateway-upload-to-s3。

10.    选择 Create Role(创建角色)。

创建一个 IAM 策略并将其附加到该 API Gateway 角色

1.    打开 IAM console(IAM 控制台)。

2.    在导航窗格中,选择角色

3.    在搜索框中,输入您创建的新 API Gateway 角色的名称。然后从 Role name(角色名称)列中选中该角色 。

4.    在 Roles detail page(角色详细信息页面)选项卡上,选择 Add permissions(添加权限)。

5.    选择 Create inline policy(创建内联策略)。

6.    在 Visual editor(可视化编辑器)选项卡的 Select a service(选择服务)部分,选择 Choose a service(选择服务)。

7.    输入 S3,然后选择 S3

8.    在 Specify the actions allowed in S3(指定 S3 中允许的操作)框中,输入 PutObject,然后选择 PutObject

9.    输入 GetObject,然后选择 GetObject

10.    展开 Resources(资源),然后选择 Specific(特定)。

11.    选择 Add ARN(添加 ARN)。

12.    对于 Bucket name(存储桶名称),输入存储桶的名称。如果适用,请包括前缀。

13.    对于 Object name(对象名称),输入对象的名称。

注意:存储桶名称指定了上传文件的位置。对象名称指定了对象为了符合策略而必须遵循的模式。有关更多信息,请参阅存储桶命名规则Amazon S3 对象概述

14.    选择 Add(添加)。

15.    选择 Next: Tags(下一步:标签)并添加标签(可选),然后选择 Next: Review(下一步:审核)。

16.    对于 Name(名称),输入策略的名称。

17.    选择 Create policy

18.    在策略搜索栏中,输入在步骤 17 中创建的策略的名称,然后选择该策略。

19.    选择 Policy actions(策略操作),然后选择 Attach(附加)。此时将显示 IAM 角色列表。

20.    搜索您之前创建的 API Gateway 角色。然后,选择该角色。

21.    选择 Attach Policy(附加策略)。

创建 API Gateway REST API

创建一个 API 来服务您的请求

1.    打开 API Gateway 控制台

2.    从导航窗格中,选择 APIs

3.    选择 Create API(创建 API)。

4.    在 Choose an API type(选择 API 类型)部分,对于 REST API,选择 Build(构建)。

5.    对于 API Name(API 名称),输入 API 的名称,然后选择 Next(下一步)。

6.    选择 Create API(创建 API)。

为您的 API 创建资源

1.    在 API 页面的 Resources(资源)面板上,选择 /

2.    对于 Actions(操作),选择 Create Resource(创建资源)。

3.    对于 Resource Name(资源名称),输入 folder

4.    对于 Resource Path(资源路径),输入 {folder}

5.    选择 Create Resource(创建资源)。

6.    在 Resources(资源)面板中,选择您在步骤 5 中创建的 /{folder} 资源。

7.    选择 Actions(操作),然后选择 Create Resource(创建资源)。

8.    对于 Resource Name(资源名称),输入 object

9.    对于 Resource Path(资源路径),输入 {object}

10.    选择 Create Resource(创建资源)。

为您的 API 创建用于上传图像或 PDF 文件的 PUT 方法

1.    选择 Actions(操作),然后选择 Create Method(创建方法)。

2.    从下拉列表中,选择 PUT,然后选中复选标记图标。

3.    在 Integration type(集成类型)类别下,选择 AWS Service(AWS 服务)。

4.    对于 AWS Region(AWS 区域),选择 us-east-1 或您在 Bucket properties(存储桶属性)页面上看到的 AWS 区域。

5.    对于 AWS Service(AWS 服务),选择 Simple Storage Service(S3)

6.    将 AWS Subdomain(AWS 子域)留空。

7.    对于 HTTP method(HTTP 方法),选择 PUT

8.    对于 Action Type(操作类型),选择 Use path override(使用路径覆盖)。

9.    对于 Path override (optional)(路径覆盖(可选)),输入 {bucket}/{key}

10.    对于 Execution role(执行角色),输入您之前创建的 IAM 角色的 Amazon Resource Name(ARN)。创建 ARN 是创建 IAM 策略并将其附加到 API Gateway 角色部分的一部分。

11.    对于 Content Handling(内容处理),选择 Passthrough(直通式)。

12.    选择 Save(保存)。

为 PUT 方法配置参数映射

1.    在 API 页面的 Resources(资源)面板中,选择 PUT

2.    选择 Integration Request(集成请求)。

3.    展开 URL Path Parameters(URL 路径参数)。

4.    选择 Add path(添加路径)。

5.    对于 Name(名称),输入 bucket

6.    对于Mapped from(映射来源),输入 method.request.path.folder

7.    选中行尾的复选标记图标。

8.    重复第 4 步到第 7 步。在第 5 步中,将 Name(名称)设置为 key。在第 6 步中,将 Mapped from(映射来源)设置为 method.request.path.object

为您的 API 创建用于检索图像的 GET 方法

1.    在 API 页面的 Resources(资源)面板中,选择 /{object}

2.    选择 Actions(操作),然后选择 Create Method(创建方法)。

3.    从下拉列表中选择 GET,然后选中复选标记图标。

4.    在 Integration type(集成类型)类别下,选择 AWS Service(AWS 服务)。

5.    对于 AWS Region(AWS 区域),选择 us-east-1 或您在 Bucket properties(存储桶属性)页面上看到的区域。

6.    对于 AWS Service(AWS 服务),选择 Simple Storage Service(S3)

7.    将 AWS Subdomain(AWS 子域)留空。

8.    对于 HTTP method(HTTP 方法),选择 GET

9.    对于 Action Type(操作类型),选择 Use path override(使用路径覆盖)。

10.    对于 Path override (optional)(路径覆盖(可选)),输入 {bucket}/{key}

11.    对于 Execution role(执行角色),输入您之前创建的 IAM 角色的 Amazon Resource Name(ARN)。 创建 ARN 是创建 IAM 策略并将其附加到 API Gateway 角色部分的一部分。

12.    对于 Content Handling(内容处理),选择 Passthrough(直通式)。

13.    选择 Save(保存)。

为 GET 方法配置参数映射

1.    在 API 页面的 Resources(资源)面板中,选择 GET

2.    选择 Integration Request(集成请求)。

3.    展开 URL Path Parameters(URL 路径参数)。

4.    选择 Add path(添加路径)。

5.    对于 Name(名称),输入 bucket

6.    对于Mapped from(映射来源),输入 method.request.path.folder

7.    选中行尾的复选标记图标。

8.    重复第 4 步到第 7 步。在第 5 步中,将 Name(名称)设置为 key。在第 6 步中,将 Mapped from(映射来源)设置为 method.request.path.object

设置响应映射以在浏览器中查看图像或 PDF 文件

1.    在 API 页面的 Resources(资源)面板中,选择 GET

2.    选择 Method Response(方法响应)。

3.    展开 200

4.    在 Response Body for 200(200 响应正文)下,删除 application/json

5.    在 Response headers for 200(200 响应标题)下,选择 Add header(添加标题)。

6.    对于 Name(名称),输入 content-type

7.    选中复选标记图标进行保存。

8.    选择 Method execution(方法执行)以返回 Method Execution(方法执行)窗格。

9.    选择 Integration Response(集成响应)。

10.    展开 200,然后展开 Header Mappings(标题映射)。

11.    选择名为 content-type 的行尾的铅笔图标。

12.    输入 image/jpeg 以查看图像文件
-或者-
输入 application/pdf 以查看 PDF 文件

为 API 设置二进制媒体类型

1.    在 API 页面的导航窗格中,选择Settings(设置)。

2.    在 Binary Media Types(二进制媒体类型)部分,选择 Add Binary Media Type(添加二进制媒体类型)。

3.    在文本框中,添加以下字符串:*/*

注意:不要在字符串两端添加引号。您可以将通配符替换为要作为二进制媒体类型的特定多用途 Internet 邮件扩展(MIME)类型。例如,选择 "image/jpeg" 会让 API Gateway 将 JPEG 图像视为二进制媒体类型。如果您添加 */*,则 API Gateway 会将所有媒体类型视为二进制媒体类型。

4.    选择 Save Changes(保存更改)。

使用 API 的二进制设置解决 CORS 错误

1.    如果您想在 Web 应用程序中使用上述 API(PUT 和 GET),则可能会遇到 CORS 错误

2.    要解决开启二进制设置时的 CORS 错误,请从 API Gateway 控制台中启动 CORS

3.    在 API 页面的 Resources(资源)面板中,选择 /{object}

4.    对于 Actions(操作),选择 Enable CORS(启用 CORS)。

5.    选择 Enable CORS and replace existing CORS headers(启用 CORS 并替换现有的 CORS 标头)。

6.    使用 update integration CLI command(更新集成 CLI 命令)更新内容处理属性。通过进行此更新,可以使用模拟集成来处理预检选项请求的二进制内容。

7.    运行两个 CLI 命令,然后更新 API ID、资源 ID 和 AWS 区域。选择 {object} 资源时,您可以从 API Gateway 控制台顶部获取 API ID 和资源 ID。

aws apigateway update-integration --rest-api-id <API Id> --resource-id <Resource Id> --http-method OPTIONS --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT' --region <AWS Region>
aws apigateway update-integration-response --rest-api-id <API Id> --resource-id <Resource Id> --http-method OPTIONS --status-code 200 --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT' --region <AWS Region>

部署您的 API

1.    在 API 页面的导航窗格中,选择Resources(资源)。

2.    从 Resources(资源)窗格中,选择 Actions(操作),然后选择 Deploy API(部署 API)。

3.    在 Deploy API(部署 API)窗口中,对于 Deployment stage(部署阶段),选择 [New Stage]([新阶段])。

4.    对于 Stage name(阶段名称),输入 v1

5.    选择 Deploy (部署)

6.    在导航窗格中,选择 Stages(阶段)。

7.    选择 v1 阶段。此时将显示用于向已部署的 API 快照发出请求的调用 URL

8.    复制调用 URL。

注意:有关更多信息,请参阅在 Amazon API Gateway 中部署 REST API

通过调用 API 将镜像文件上传到 S3

将对象的存储桶名称和文件名附加到 API 的调用 URL。然后,使用您选择的客户端发出 PUT HTTP 请求。例如,对于 Postman 应用程序,从下拉列表中选择 PUT method(PUT 方法)。选择 Body(正文),然后选择 binary(二进制)。出现 Select File(选择文件)按钮时,选择要上传的本地文件。

有关更多信息,请参阅在 Amazon API Gateway 中调用 REST API

用于发出 PUT HTTP 请求以上传图像或 PDF 的 curl 命令示例

注意:在此示例中,abc12345 是您的 API ID,testfolder 是您的 S3 存储桶,testimage.jpeg 是您正在上传的本地文件。

curl -i --location --request PUT 'https://abc12345.execute-api.us-west-2.amazonaws.com/v1/testfolder/testimage.jpeg' --header 'Content-Type: text/plain' --data-binary '@/Path/to/file/image.jpeg'

重要提示:如果二进制媒体类型列表中包含 */*,则可以发出 PUT 请求来上传文件。如果二进制媒体类型列表中包含 image.jpeg,则必须为您的 PUT 请求添加 Content-Type header(内容类型标头)。您必须将 Content-Type header(内容类型标头)设置为 image/jpeg

现在,您可以使用相同的 URL 在 Web 浏览器中查看图像或 PDF,因为 Web 浏览器会发出 GET 请求。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?