Feat: adapt new uploader for COS policy
This commit is contained in:
parent
07f13cc350
commit
9e5713b139
6 changed files with 18 additions and 69 deletions
|
@ -283,21 +283,6 @@ func OneDriveCallbackAuth() gin.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
// COSCallbackAuth 腾讯云COS回调签名验证
|
||||
func COSCallbackAuth() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
//// 验证key并查找用户
|
||||
//resp, _ := uploadCallbackCheck(c)
|
||||
//if resp.Code != 0 {
|
||||
// c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||
// c.Abort()
|
||||
// return
|
||||
//}
|
||||
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// S3CallbackAuth Amazon S3回调签名验证
|
||||
func S3CallbackAuth() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
|
|
|
@ -3,8 +3,6 @@ package model
|
|||
import (
|
||||
"encoding/gob"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
@ -231,7 +229,7 @@ func (policy *Policy) IsUploadPlaceholderWithSize() bool {
|
|||
return true
|
||||
}
|
||||
|
||||
if util.ContainsString([]string{"onedrive", "oss", "qiniu"}, policy.Type) {
|
||||
if util.ContainsString([]string{"onedrive", "oss", "qiniu", "cos"}, policy.Type) {
|
||||
return policy.OptionsSerialized.PlaceholderWithSize
|
||||
}
|
||||
|
||||
|
@ -243,39 +241,6 @@ func (policy *Policy) CanStructureBeListed() bool {
|
|||
return policy.Type != "local" && policy.Type != "remote"
|
||||
}
|
||||
|
||||
// GetUploadURL 获取文件上传服务API地址
|
||||
func (policy *Policy) GetUploadURL() string {
|
||||
server, err := url.Parse(policy.Server)
|
||||
if err != nil {
|
||||
return policy.Server
|
||||
}
|
||||
|
||||
controller, _ := url.Parse("")
|
||||
switch policy.Type {
|
||||
case "local", "onedrive":
|
||||
return "/api/v3/file/upload"
|
||||
case "remote":
|
||||
controller, _ = url.Parse("/api/v3/slave/upload")
|
||||
case "oss":
|
||||
return "https://" + policy.BucketName + "." + policy.Server
|
||||
case "cos":
|
||||
return policy.Server
|
||||
case "upyun":
|
||||
return "https://v0.api.upyun.com/" + policy.BucketName
|
||||
case "s3":
|
||||
if policy.Server == "" {
|
||||
return fmt.Sprintf("https://%s.s3.%s.amazonaws.com/", policy.BucketName,
|
||||
policy.OptionsSerialized.Region)
|
||||
}
|
||||
|
||||
if !strings.Contains(policy.Server, policy.BucketName) {
|
||||
controller, _ = url.Parse("/" + policy.BucketName)
|
||||
}
|
||||
}
|
||||
|
||||
return server.ResolveReference(controller).String()
|
||||
}
|
||||
|
||||
// SaveAndClearCache 更新并清理缓存
|
||||
func (policy *Policy) SaveAndClearCache() error {
|
||||
err := DB.Save(policy).Error
|
||||
|
|
|
@ -357,8 +357,9 @@ func (handler Driver) Token(ctx context.Context, ttl int64, uploadSession *seria
|
|||
|
||||
res, err := handler.getUploadCredential(ctx, postPolicy, keyTime, savePath)
|
||||
if err == nil {
|
||||
res.SessionID = uploadSession.Key
|
||||
res.Callback = apiURL
|
||||
res.Key = uploadSession.Key
|
||||
res.UploadURLs = []string{handler.Policy.Server}
|
||||
}
|
||||
|
||||
return res, err
|
||||
|
@ -415,10 +416,10 @@ func (handler Driver) getUploadCredential(ctx context.Context, policy UploadPoli
|
|||
signature := hmacFinalSign.Sum(nil)
|
||||
|
||||
return &serializer.UploadCredential{
|
||||
Policy: policyEncoded,
|
||||
Path: savePath,
|
||||
AccessKey: handler.Policy.AccessKey,
|
||||
Token: fmt.Sprintf("%x", signature),
|
||||
KeyTime: keyTime,
|
||||
Policy: policyEncoded,
|
||||
Path: savePath,
|
||||
AccessKey: handler.Policy.AccessKey,
|
||||
Credential: fmt.Sprintf("%x", signature),
|
||||
KeyTime: keyTime,
|
||||
}, nil
|
||||
}
|
||||
|
|
|
@ -27,13 +27,12 @@ type UploadCredential struct {
|
|||
Credential string `json:"credential,omitempty"`
|
||||
UploadID string `json:"uploadID,omitempty"`
|
||||
Callback string `json:"callback,omitempty"` // 回调地址
|
||||
Path string `json:"path,omitempty"` // 存储路径
|
||||
AccessKey string `json:"ak,omitempty"`
|
||||
KeyTime string `json:"keyTime,omitempty"` // COS用有效期
|
||||
Policy string `json:"policy,omitempty"`
|
||||
|
||||
Token string `json:"token"`
|
||||
Policy string `json:"policy"`
|
||||
Path string `json:"path"` // 存储路径
|
||||
AccessKey string `json:"ak"`
|
||||
KeyTime string `json:"key_time,omitempty"` // COS用有效期
|
||||
Key string `json:"key,omitempty"` // 文件标识符,通常为回调key
|
||||
Token string `json:"token,omitempty"`
|
||||
}
|
||||
|
||||
// UploadSession 上传会话
|
||||
|
|
|
@ -279,8 +279,8 @@ func InitMasterRouter() *gin.Engine {
|
|||
}
|
||||
// 腾讯云COS策略上传回调
|
||||
callback.GET(
|
||||
"cos/:key",
|
||||
middleware.COSCallbackAuth(),
|
||||
"cos/:sessionID",
|
||||
middleware.UseUploadSession("cos"),
|
||||
controllers.COSCallback,
|
||||
)
|
||||
// AWS S3策略上传回调
|
||||
|
|
|
@ -200,17 +200,16 @@ func (service *COSCallback) PreProcess(c *gin.Context) serializer.Response {
|
|||
defer fs.Recycle()
|
||||
|
||||
// 获取回调会话
|
||||
callbackSessionRaw, _ := c.Get("callbackSession")
|
||||
callbackSession := callbackSessionRaw.(*serializer.UploadSession)
|
||||
uploadSession := c.MustGet(filesystem.UploadSessionCtx).(*serializer.UploadSession)
|
||||
|
||||
// 获取文件信息
|
||||
info, err := fs.Handler.(cos.Driver).Meta(context.Background(), callbackSession.SavePath)
|
||||
info, err := fs.Handler.(cos.Driver).Meta(context.Background(), uploadSession.SavePath)
|
||||
if err != nil {
|
||||
return serializer.Err(serializer.CodeUploadFailed, "文件信息不一致", err)
|
||||
}
|
||||
|
||||
// 验证实际文件信息与回调会话中是否一致
|
||||
if callbackSession.Size != info.Size || callbackSession.Key != info.CallbackKey {
|
||||
if uploadSession.Size != info.Size || uploadSession.Key != info.CallbackKey {
|
||||
return serializer.Err(serializer.CodeUploadFailed, "文件信息不一致", err)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue