必须用 aws-sdk-go-v2,因其强制显式配置隔离、默认支持 context、自动凭证链、兼容 S3 兼容层;v1 存在并发配置污染、无 context、需手动构造凭证等问题。

别用 aws-sdk-go-v1 新项目了,官方已停止功能更新,v2 才是当前唯一推荐路径。
为什么必须用 aws-sdk-go-v2 而不是 v1
v1 的 session.Must() 和隐式全局配置在并发任务中极易串配置——比如两个 goroutine 同时操作不同 region 的 bucket,一个可能意外覆盖另一个的 Region 或 Endpoint;v2 强制显式传 config.Config,每个 client 完全隔离。
- v2 默认启用 context 传递,超时、取消可精确控制;v1 很多 API 没有
context.Context参数 - v2 的凭证链(
config.LoadDefaultConfig())自动兼容环境变量、~/.aws/credentials、EC2 IAM roles;v1 需手动构造credentials.Credentials - v2 对 S3 兼容层(如阿里 OSS、腾讯 COS)更友好:OSS 必须设
region为oss-cn-hangzhou且签名强制 v4,v1 容易因 region 错误直接报InvalidRequest: The authorization header is malformed
config.LoadDefaultConfig() 不是摆设,必须显式调用
只设环境变量 AWS_ACCESS_KEY_ID 和 AWS_REGION 是不够的。v2 不会自动读取,不调 config.LoadDefaultConfig() 就 panic。
- 本地开发:确保
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION已导出 - 对接 OSS:必须手动覆盖
EndpointResolverWithOptions,例如https://oss-cn-hangzhou.aliyuncs.com - 对接 COS:除 endpoint 外,还要设
UsePathStyle: true,否则生成 URL 是bucket.cos.ap-guangzhou.myqcloud.com(错误),正确应为cos.ap-guangzhou.myqcloud.com/bucket
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("oss-cn-hangzhou"),
config.WithEndpointResolverWithOptions(
aws.EndpointResolverWithOptionsFunc(func(service, region string) (string, error) {
return "https://oss-cn-hangzhou.aliyuncs.com", nil
}),
),
)
上传前必设 ContentType,否则浏览器乱下载
不设 PutObjectInput.ContentType,S3 默认存为 binary/octet-stream。用户点开图片或 HTML 链接时,浏览器直接触发下载而非渲染。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
立即学习“go语言免费学习笔记(深入)”;
- 用
mime.TypeByExtension(filepath.Ext(path))自动推断,fallback 到application/octet-stream - Windows 路径注意:
filepath.Ext("C:\data\report.pdf")返回空,得先filepath.ToSlash() - gzip 压缩上传时:设
ContentType为源类型(如text/html),再加ContentEncoding: "gzip",否则 CDN 不解压
批量删除别超 1000 个 key,DeleteObjects 硬性限流
DeleteObjects 接口一次最多删 1000 个 object,超了直接返回 MalformedXML 错误,不是分页提示,脚本直接崩。
- 不要依赖
ListObjectsV2.MaxKeys当删除上限——它只控制列出数量,和删除无关 - 扫描出 5000 个待删文件?必须手动切片:
for i := 0; i - 每块构造独立的
DeleteObjectsInput,Keys字段填 1000 以内条目
最常被跳过的其实是 region 和 endpoint 的耦合关系:OSS 的 region 不是占位符,必须真实;COS 的 endpoint 和 UsePathStyle 必须配对;S3 的 DisableSSL 在私有部署时才需要开——这些没对齐,连 ListBuckets 都过不去。

















