gin框架无法直接对接阿里云vod上传,因其需先调用createuploadvideo获取含sts凭证的uploadaddress,再按指定endpoint、filename及header直传;uploadauth需base64解码后提取accesskeyid等字段,videoid必须持久化;返回前端时应过滤敏感信息并校验文件类型;转码需显式设置templategroupid,回调须公网可达且签名校验。

context.FormFile 直接对接点播系统。
为什么不能直接用 UploadFile 上传到 VOD?
很多人误以为把 OSS 的上传逻辑套到 VOD 就能用,结果卡在签名失败、400 Bad Request 或 InvalidParameter 错误上。根本原因是:VOD 不是纯对象存储,它是一套带业务逻辑的媒体服务平台——上传前必须先调用 GetVideoUploadAuth 或 CreateUploadVideo 获取临时凭证和上传地址,再用该地址直传,而非 POST 到任意 endpoint。
- VOD 上传流程分两步:先申请授权(含
UploadAddress和VideoId),再用返回的UploadAddress中的Endpoint+AccessKeyId+AccessKeySecret+SecurityToken构造 STS 直传请求 - OSS SDK 的
PutObject无法复用,因为 VOD 要求上传路径必须匹配其生成的FileName(如video/xxx.mp4),且需携带特定 header:x-oss-security-token、x-oss-date - 若强行用 Gin 接收文件后“中转”上传,会吃光内存(大视频)、超时、且丧失断点续传和秒传能力
CreateUploadVideo 返回字段怎么解析才不丢数据?
调用 CreateUploadVideo 后返回的 JSON 里,关键字段不是平铺的,而是嵌套在 Video 和 UploadAddress 里。常见错误是直接取 response["UploadAddress"] 当字符串拼接,实际它是 base64 编码的结构体,必须用 SDK 提供的 json.Unmarshal 解析或手动 base64.DecodeString 再 json.Unmarshal。
-
response.VideoId是后续所有操作(截图、转码、播放)的唯一标识,务必持久化存储,不能只存在内存或 session -
response.UploadAddress.Endpoint是直传目标地址,形如https://vod.cn-shanghai.aliyuncs.com,不是 OSS 的 bucket endpoint -
response.UploadAddress.UploadAuth是 STS token 的 base64 编码字符串,解码后得到AccessKeyId、AccessKeySecret、SecurityToken、Expiration - 注意:
UploadAddress有效期默认 15 分钟,过期后上传会返回InvalidSignature
Gin 路由如何安全返回 VOD 上传参数?
不能把 UploadAuth 原样返回给前端——它含敏感凭证。正确做法是:后端调用 CreateUploadVideo → 提取并校验 Expiration → 用 Gin 的 c.JSON 返回精简结构,仅包含前端必需字段。
- 必须过滤掉
AccessKeySecret和SecurityToken的明文传输风险,但前端直传又需要它们:解决方案是将这两个字段拼进预签名 URL 或封装为加密 payload(如 AES 加密后传给前端,前端解密再构造请求) - 推荐最小返回结构:
{"video_id": "...", "endpoint": "...", "access_key_id": "...", "security_token": "...", "expiration": "2026-08-11T15:30:00Z"},其中security_token可选,若前端环境可信(如内网 App)可传,否则走加密通道 - 务必校验
Content-Type为video/*或白名单后缀(.mp4、.mov),防止恶意文件类型绕过 - 示例代码片段:
resp, err := client.CreateUploadVideo(request) if err != nil { c.JSON(400, gin.H{"error": "vod auth failed"}) return } c.JSON(200, gin.H{ "video_id": resp.VideoId, "endpoint": resp.UploadAddress.Endpoint, "access_key_id": resp.UploadAddress.UploadAuth.AccessKeyId, "security_token": resp.UploadAddress.UploadAuth.SecurityToken, "expires_at": resp.UploadAddress.UploadAuth.Expiration, })
上传成功后怎么触发自动转码和回调通知?
VOD 的 CreateUploadVideo 默认不启用转码,必须显式设置 TemplateGroupId;而回调通知(如上传完成、转码完成)依赖你提前在控制台配置 HTTP 回调地址,Gin 需暴露对应路由并校验签名。
- 调用
CreateUploadVideo时传入request.TemplateGroupId = "your-template-group-id",否则上传完只是原始文件,不会自动生成不同清晰度版本 - 回调地址必须是公网可访问的 URL(如
https://api.yourdomain.com/vod/callback),Gin 路由需用c.Request.Header.Get("Authorization")校验阿里云签名,防止伪造请求 - 回调 body 是 base64 编码的 JSON,需先
base64.StdEncoding.DecodeString再解析,关键字段包括EventType(UploadComplete、TranscodeComplete)、VideoId、TranscodeStatus - 注意:回调无重试机制,若 Gin 接口返回非 2xx 状态码,阿里云会丢弃该事件——务必保证回调处理逻辑轻量、异步落库、不阻塞
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











