应使用 github.com/qiniu/go-sdk/v7,删除 qiniupkg/storage 和 github.com/qiniu/api.v7;导入路径须为 /v7/auth、/v7/storage 等;上传 token 必须显式绑定正确 bucket(全小写)和 zone(如 &storage.zonehuadong);接口区分 putfile(路径)、put([]byte);配置需显式注入,避免未初始化变量。

直接用 github.com/qiniu/go-sdk/v7,别碰 qiniupkg/storage 或 github.com/qiniu/api.v7——后者已归档,go build 会报错找不到包。
确认 SDK 版本和导入路径是否正确
旧教程里写的 github.com/qiniu/api.v7 是历史别名,当前唯一支持的是带 /v7 的完整路径。必须手动检查并修正:
-
go.mod中删掉所有qiniupkg和api.v7相关行,执行go mod tidy - import 必须写成:
"github.com/qiniu/go-sdk/v7/auth"、"github.com/qiniu/go-sdk/v7/storage"、"github.com/qiniu/go-sdk/v7/storage/putpolicy" - IDE 自动补全可能推旧包,务必手敲,不依赖提示
上传 token 必须绑定 bucket 和区域,不能省略
token 不是通用凭证,拼错 Bucket 名或选错 Zone,上传必返回 401 Unauthorized 或 invalid bucket name:
-
Bucket名必须全小写,只含字母、数字、中划线(如my-blog-img),不能有下划线或大写 -
Zone必须显式指定,例如华东填&storage.ZoneHuadong,华北填&storage.ZoneHuabei,不能靠自动探测 -
PutPolicy{Scope: "your-bucket-name"}中的Scope值必须和配置的Bucket完全一致
上传接口别混用 Put 和 PutFile
v7 SDK 中 storage.Uploader 已移除,接口行为有明确区分:
- 传本地文件路径字符串 → 用
uploader.PutFile() - 传
[]byte或内存数据 → 用uploader.Put() - 传
multipart.File(如 Gin 的c.FormFile)→ 必须先读取为[]byte或用PutFile配合临时路径,不能直接塞进Put - 常见错误:把
*os.File或路径字符串传给Put,结果上传的是文件描述符地址或路径文本本身
配置项加载和初始化顺序容易出错
很多项目在 init() 里读配置,但没确保 utils 包先初始化,导致 AccessKey 等变量为空:
- 不要在
model或upload.go里直接引用未初始化的全局变量 - 推荐做法:把配置封装成结构体,由调用方传入,或在
main()初始化后显式注入 - 如果用
ini包读配置,注意Section("qiniu").Key("Zone").MustInt(1)这类调用需确保 section 存在,否则 panic - 域名
QiniuServer必须带协议(如https://xxx.qiniucdn.com),否则拼接 URL 时会出错
最常被忽略的是 Zone 和 Bucket 在 token 生成与上传配置中的双重校验——两者必须严格匹配,且不能依赖默认值;哪怕配置文件里写了 Zone=1,代码里也得转成 &storage.ZoneHuadong 才生效。











