beego中应直接用getfile获取multipart.file(实现io.reader)传给七牛put方法直传,避免savetofile;需校验fileheader.size、匹配zone、设usehttps=true、显式指定contenttype,并用自定义https域名拼播放url。

Beego 框架里直接用 GetFile 拿到音视频文件后,不能直接存本地再传七牛——大文件容易超时、占磁盘、阻塞请求。正确做法是把上传流(multipart.File)转成 io.Reader,走七牛 SDK 的 Put 方法直传,跳过临时文件。
Beego 中如何获取并透传文件流给七牛 SDK
Beego 的 Controller.GetFile 返回的是 multipart.File 和 *multipart.FileHeader,前者实现了 io.Reader 接口,可直接喂给七牛的 Put 方法。
- 别调
SaveToFile,那是为小图/文档设计的,音视频动辄几十 MB,一写磁盘就卡住或 OOM -
FileHeader.Size可提前校验大小,比如限制单个视频 ≤ 500MB:if h.Size > 500*1024*1024 { ... } - 注意
GetFile的第一个参数必须和前端<input name="video">的name值严格一致,否则返回nil,且无错误提示
七牛上传用 Put 而不是 PutFile
PutFile 是读本地路径,Put 才支持传 io.Reader。音视频流不能落地,必须用后者。
- 构造
upToken时,key要带路径前缀,比如"videos/2026/08/" + uuid.New().String() + ".mp4",七牛靠/渲染“目录” -
PutExtra里可加Params传业务字段,如"x:uid": "12345",后续回调或队列消费时能拿到 - 务必设
ContentType,尤其视频:上传前从h.Header.Get("Content-Type")取,避免七牛默认设成application/octet-stream导致浏览器无法直接播放
Beego 配置项与七牛 Zone 必须匹配
Beego 自己不参与上传逻辑,但你读配置时若用错 Zone(比如配了 ZoneHuadong 却把 bucket 创建在华北),上传会卡死或报 context deadline exceeded。
- 查 bucket 实际区域:进七牛控制台 → 存储空间 → 点开空间名 → 看「区域」字段,对应 SDK 的
storage.ZoneHuabei/ZoneHuadong/ZoneHuanan等 - Beego 的
app.conf里建议按 section 分组,例如:[qiniu]下写AccessKey、SecretKey、Bucket、Zone=huadong,Go 代码里用beego.AppConfig.String("qiniu::Zone")读,再映射成 SDK 常量 -
UseHTTPS = true必须开,否则国内 CDN 节点可能拦截非 HTTPS 回源请求,导致上传失败静默超时
上传成功后怎么拼出可播放 URL
七牛 SDK 的 PutRet 不含 URL,只返回 Key 和 Hash。URL 要自己拼,且必须用你绑定的自定义域名(不是七牛默认域名)。
- 格式固定为:
"https://" + Domain + "/" + key,其中Domain是你在七牛控制台「空间设置 → 域名管理」里备案并启用的 CNAME 域名,比如cdn.example.com - 别用
xxx.bkt.clouddn.com这类默认域名:未备案时会被运营商劫持,iOS Safari 直接拒绝播放;HTTPS 未正确配置时 Chrome 会报Mixed Content - 如果前端要预览,把这个 URL 连同
duration(可用 ffprobe 提前抽帧获取)一并返回 JSON,别让前端再发一次请求查
最容易被忽略的是:音视频上传必须做流式透传 + 显式设 ContentType + 用自定义 HTTPS 域名拼 URL。三者缺一,要么上传失败,要么上传成功但播不了。











