必须用 oss.new 初始化 client,endpoint 仅填域名(如 oss-cn-hangzhou.aliyuncs.com),aksk 需 ram 子账号生成,上传需显式设置 oss.timeout 避免卡死。

怎么初始化 oss.Client 才不 panic?
直接 new 出来的 oss.Client 会 panic,必须用 oss.New 工厂函数。常见错误是把 endpoint 写成带 http:// 或 https:// 的完整 URL,实际只要域名部分(比如 oss-cn-hangzhou.aliyuncs.com),协议由 SDK 自动补全。
- AccessKeyID 和 AccessKeySecret 必须从阿里云 RAM 控制台生成,不能用主账号密钥
- endpoint 不要加路径(如
/v1)、不要带端口、不要写成 IP - 国内 region 推荐用
oss-cn-hangzhou这类短名,别用oss-cn-hangzhou-internal(内网地址只在 ECS 同 region 内可用) - 如果报错
InvalidAccessKeyId.NotFound,大概率是 AKSK 权限没开或 endpoint 错了
PutObject 上传文件时为什么总超时或卡住?
默认上传走 HTTP,大文件或弱网下容易卡死。SDK 默认没有设置超时,底层 http.Transport 也未配置,导致连接 hang 住不返回。
- 必须显式传入
oss.Timeout参数,例如oss.Timeout(60 * time.Second) - 小文件(PutObject 没问题;大文件建议切到
PutObjectFromFile,它内部自动分块 + 断点续传 - 若本地路径含中文或空格,先用
url.PathEscape处理,否则可能报InvalidObjectName - 注意
PutObject的body参数是io.Reader,传完就关闭,别复用
如何让上传支持断点续传和进度回调?
原生 PutObject 不支持断点续传,必须用 resumableUpload 模块。进度回调也不是内置能力,得靠自己包装 io.Reader。
- 启用断点续传:用
oss.ResumableUpload+oss.Routines(3)(并发上传分片) - 临时目录必须可写,且空间足够存分片(默认在
/tmp/aliyun-oss-go-sdk,可用oss.ObjectMultipartUploadDir改) - 进度回调需自定义
io.Reader实现Read方法,在每次读取后触发回调,别用os.File直接传 - 断点续传的 ObjectKey 必须完全一致(包括大小写),否则 SDK 当作新任务重来
上传后文件访问 403 或 404 怎么查?
不是代码问题,而是权限和 ACL 配置没对上。OSS 默认所有文件私有,即使上传成功,直连 URL 也会 403。
- 上传时加
oss.ACL(oss.ACLPublicRead)才能用公开 URL 访问(慎用,敏感数据别开) - 确认 Bucket 的读写权限策略(Bucket Policy)没 deny 你的请求来源
- 404 多半是 ObjectKey 写错了——OSS 区分大小写,
test.jpg和Test.jpg是两个文件 - 如果用了 CDN 加速,记得刷新缓存,否则旧的 403 响应可能被缓存住
最常被忽略的是:上传成功不等于可访问,ACL、Bucket Policy、RAM 策略、CDN 缓存这四层得一层层过一遍,缺一不可。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











