必须用oss.new初始化client,endpoint需带https://前缀且仅为region域名(如https://oss-cn-hangzhou.aliyuncs.com),不可含bucket名或缺协议;aksk须来自ram子账号;上传必须显式传oss.timeout,否则弱网或大文件下会卡死。

必须用 oss.New 初始化 client,endpoint 要带 https:// 前缀且仅含域名,AKSK 必须来自 RAM 子账号,上传必须显式传 oss.Timeout,否则大文件或弱网下会卡死。
为什么 oss.New 传错 endpoint 就 panic 或 403?
常见错误是把 Bucket 域名(如 https://my-bucket.oss-cn-hangzhou.aliyuncs.com)当 endpoint 传进去,或者漏掉协议头写成 oss-cn-hangzhou.aliyuncs.com。SDK 会尝试拼 http:// 导致签名失败或被拒绝。
-
oss.New("https://oss-cn-hangzhou.aliyuncs.com", ak, sk)✅ 正确:纯 Region Endpoint,带https:// -
oss.New("oss-cn-hangzhou.aliyuncs.com", ak, sk)❌ 缺协议,内部可能降级为 HTTP -
oss.New("https://my-bucket.oss-cn-hangzhou.aliyuncs.com", ak, sk)❌ 混入 bucket 名,报InvalidEndpoint或签名异常 - 内网 endpoint(如
oss-cn-hangzhou-internal.aliyuncs.com)只在同 region 的 ECS 内可用,本地调试别用
PutObjectFromFile 上传卡住、超时、goroutine 假死怎么办?
SDK 默认不设 HTTP 超时,底层 http.Transport 也未配置,网络抖动或 OSS 响应慢时请求会 hang 住,不返回也不报错。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 必须显式加
oss.Timeout参数,单位是毫秒:bucket.PutObjectFromFile(key, path, oss.Timeout(60*1000)) - 小文件(10*1000;中等(1–10MB)建议
30*1000;大文件(>10MB)至少60*1000 - 不要复用
os.File句柄——PutObjectFromFile内部会打开并关闭,传入路径字符串即可 - 本地路径含中文或空格?先用
url.PathEscape处理,否则可能报InvalidObjectName
上传成功却返回 403/404,不是代码问题,是权限和命名没对齐
OSS 默认所有 Object 私有,上传成功 ≠ 可公开访问。404 多半是大小写或路径拼错,OSS 完全区分大小写。
- 要直连 URL 访问,上传时必须加
oss.ACL(oss.ACLPublicRead),但敏感数据禁止开 - 检查 Bucket Policy 是否
Deny了你的来源 IP 或 Referer -
test.jpg和Test.jpg是两个不同文件,URL 错一个字母就是 404 - 用了 CDN?记得手动刷新缓存,否则旧的 403 响应可能被缓存数小时
断点续传和进度回调怎么加?原生 PutObject 不支持
PutObject 是简单上传,不支持断点、无进度。大文件或弱网场景必须切到 resumableUpload 模块,并自己包装 io.Reader。
- 用
bucket.PutObjectFromFile自动走分片上传(内部调resumableUpload),但需确保临时目录可写,默认是/tmp/aliyun-oss-go-sdk - 自定义进度回调:实现
io.Reader,在Read方法里触发回调,别直接传*os.File - 断点续传依赖
ObjectKey完全一致(含大小写),改一个字符就重来 - 可通过
oss.Routines(3)控制并发分片数,但别设太高,避免打满本地磁盘 I/O
最常被忽略的是:上传成功不等于可访,403 往往卡在 ACL 或 Bucket Policy;endpoint 格式错一次,后续所有操作都签名失败;超时参数不设,服务会在某次上传后静默卡死几个小时——这些不是偶发 bug,是 SDK 的硬性约束。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










