大文件上传必须用 s3manager.uploader:它自动分块(默认5mb/chunk)、并发上传(默认5 goroutines)、失败重试(默认3次),并支持context控制超时与取消;>100mb文件应优先使用uploader,避免putobject超时、oom或被s3拒绝。

大文件上传必须用 s3manager.Uploader,别直接调 PutObject
直接用 PutObject 传几百 MB 以上的文件,大概率会超时、OOM 或被 S3 拒绝。S3 对单次请求有 5GB 限制,但实际中网络抖动、内存压力会让它很脆弱。
-
s3manager.Uploader自动分块(默认 5MB/chunk)、并发上传(默认 5 goroutines)、失败重试(默认 3 次),还能配合context.Context控制超时和取消 - 上传前建议先用
os.Stat检查文件大小,>100MB 就走Uploader;PutObject 简单直传 - 注意设置
uploader.Concurrency:本地开发可设低点(2–3),生产环境根据实例 CPU 核数调高(8–16),但别超过 20,否则可能触发 S3 的连接限流 - 别忽略
uploader.PartSize:太小(如 1MB)会增加 HTTP 请求次数;太大(如 100MB)会让单块失败重传代价变高,推荐 5–10MB
临时凭证必须绑定 SessionToken,硬编码密钥是线上事故高发区
用 credentials.NewStaticCredentialsProvider 直接写死 AccessKeyID 和 SecretAccessKey,哪怕只在测试环境,也等于把门钥匙焊死在门上。
- AWS 推荐的路径是:本地开发用
~/.aws/credentials,K8s 环境用 IRSA(IAM Roles for Service Accounts),EC2 用实例角色 —— 全部走config.LoadDefaultConfig自动加载,不用改代码 - 如果必须用临时凭证(比如前端直传预签名 URL 后后端代签),一定要传全三元组:
AccessKeyID、SecretAccessKey、SessionToken,漏掉SessionToken会导致InvalidToken错误 - 临时凭证有效期短(通常 15–60 分钟),别缓存
aws.Config实例;每次上传前重新LoadDefaultConfig或显式构造带新凭证的 config
生成预签名 URL 时,Expires 要按场景设,别统一填 1 小时
预签名 URL 泄露 = 文件被任意下载/覆盖。设太长(如 24 小时)等于裸奔;设太短(如 30 秒)又容易前端还没发起请求就过期。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 下载链接:用户点击后立即触发下载,设 5–15 分钟足够。用
s3.PresignClient.PresignGetObject,传WithExpires参数 - 上传链接(PUT):前端需先
HEAD检查、再上传、再回调校验,整个链路耗时不可控,建议 15–30 分钟 - 千万别用
time.Now().Add(1 * time.Hour)硬算时间戳 ——Presign方法内部会自动基于当前时间 +Expires计算,传错单位(比如秒 vs 纳秒)会导致 URL 瞬间失效 - 如果要支持断点续传,预签名 URL 必须带完整
Content-MD5或x-amz-content-sha256校验头,否则 S3 会拒绝分块上传的后续 Part
本地调试时,MinIO 是唯一靠谱的替代方案
用 http://localhost:9000 模拟 S3,比 mock SDK 或写一堆 if-else 切换 endpoint 更真实、更早暴露问题。
- 启动 MinIO:用官方 Docker 镜像,加
-e MINIO_ROOT_USER=Q3AM3UQ867SPQN5A651N和-e MINIO_ROOT_PASSWORD=zuf+tfteSlswRu7BJ86wevDeUf0GkE162zX9f0J9Fy1(这是 MinIO 默认密钥,别改) - SDK 连接时,关掉 SSL 验证:
config.WithHTTPClient(&http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}),否则会报x509: certificate signed by unknown authority - MinIO 不支持所有 S3 API(比如不支持
ListMultipartUploads的某些参数),遇到奇怪错误先查 MinIO 版本兼容性表,别急着怀疑自己代码 - MinIO 的 bucket policy、CORS 配置必须手动 set,不像 AWS 控制台点几下就行;用
mc命令行工具配最稳:mc anonymous set public myminio/mybucket
真正难的不是写通流程,而是让上传在弱网、高并发、临时凭证轮转这些边界条件下不崩 —— 这些地方没日志、没监控、没重试,出问题就是静默失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










