使用 Go 语言调用 AWS S3 接口上传图片到 Cloudflare R2 的完整教程
Cloudflare R2 兼容 AWS S3 的 API,因此我们可以使用 Go 语言结合 AWS 官方 SDK 来操作 R2,实现图片上传等功能。本文将详细介绍如何用 Go 调用 AWS SDK v2,通过 S3 接口将本地图片上传到 Cloudflare R2,并且讲解常见错误及解决方法。
步骤概览
准备 R2 账户信息
获取 R2 的 Endpoint、Access Key 和 Secret Key。注意,R2 的 Endpoint 与 AWS S3 不同,通常格式为:1
https://<account_id>.r2.cloudflarestorage.com
Bucket 不同于 Endpoint,是在请求路径中指定的。
在 Go 项目中引入 AWS SDK v2
使用 Go 语言官方 AWS SDK v2,并配置为访问 R2 的 Endpoint。实现图片上传逻辑
- 读取本地图片文件
- 配置客户端,强制使用路径风格(Path-style)访问
- 调用
PutObject
接口完成上传操作
依赖安装
|
|
代码示例
下面是一份可运行的完整示例,实现把本地图片上传到 Cloudflare R2。
|
|
关键点解析
Endpoint
Cloudflare R2 Endpoint 是账号级别的 URL,不是 Bucket 级的。形如:https://<account_id>.r2.cloudflarestorage.com
Bucket 名作为路径的一部分放入请求中,而非子域名。Path-style 访问
AWS SDK 默认会把 Bucket 当作二级域(virtual hosted-style),例如bucket.endpoint
。Cloudflare R2 目前只支持路径风格访问,即:1
https://endpoint/bucket/key
因此需在 S3 客户端中添加:
1
o.UsePathStyle = true
这一步非常关键,避免出现 TLS 握手失败的错误。
Region
R2 并不严格限定 Region,你可以写成"auto"
或"us-east-1"
不影响使用。权限设置
默认桶是私有的,如要公开访问可以设置ACL
为public-read
。Content-Type
上传时指定正确的 Content-Type ,让浏览器或者客户端正确识别文件类型。
TLS 握手失败问题排查
如果遇到类似下面的错误:
|
|
请注意:
Endpoint 配置是否正确
确保使用正确格式的 Endpoint,是账号 ID 作为子域,而不是 Bucket 名。UsePathStyle 是否启用
AWS SDK 默认使用虚拟托管式(virtual-hosted-style)导致 Host 不匹配,必须设置UsePathStyle = true
。TLS 环境
检查 Go 版本是否足够新(建议 Go 1.18+),以及网络环境没有使用代理或拦截 HTTPS。
总结
- 使用 Go 调用 AWS SDK v2 操作 Cloudflare R2,关键是正确配置 Endpoint 和强制路径风格访问
- 代码中需加载自定义 Endpoint 解析器,并指定路径风格访问才能避免 TLS 错误
- 上传时指定文件的 Content-Type 和权限控制,满足业务需求
希望这篇教程能够帮助你顺利用 Go 语言上传图片至 Cloudflare R2。