From 9e5713b139a2e98d1bfd7d8b3a84dcb16d04ace8 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Sun, 20 Mar 2022 11:27:17 +0800 Subject: [PATCH] Feat: adapt new uploader for COS policy --- middleware/auth.go | 15 ----------- models/policy.go | 37 +--------------------------- pkg/filesystem/driver/cos/handler.go | 13 +++++----- pkg/serializer/upload.go | 11 ++++----- routers/router.go | 4 +-- service/callback/upload.go | 7 +++--- 6 files changed, 18 insertions(+), 69 deletions(-) diff --git a/middleware/auth.go b/middleware/auth.go index 09bc434..1540d0a 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -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) { diff --git a/models/policy.go b/models/policy.go index 5d2717e..c182eba 100644 --- a/models/policy.go +++ b/models/policy.go @@ -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 diff --git a/pkg/filesystem/driver/cos/handler.go b/pkg/filesystem/driver/cos/handler.go index cc55ac4..5389641 100644 --- a/pkg/filesystem/driver/cos/handler.go +++ b/pkg/filesystem/driver/cos/handler.go @@ -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 } diff --git a/pkg/serializer/upload.go b/pkg/serializer/upload.go index b82ccb6..da61c7d 100644 --- a/pkg/serializer/upload.go +++ b/pkg/serializer/upload.go @@ -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 上传会话 diff --git a/routers/router.go b/routers/router.go index 255c9b3..fae395c 100644 --- a/routers/router.go +++ b/routers/router.go @@ -279,8 +279,8 @@ func InitMasterRouter() *gin.Engine { } // 腾讯云COS策略上传回调 callback.GET( - "cos/:key", - middleware.COSCallbackAuth(), + "cos/:sessionID", + middleware.UseUploadSession("cos"), controllers.COSCallback, ) // AWS S3策略上传回调 diff --git a/service/callback/upload.go b/service/callback/upload.go index da0d67e..411b571 100644 --- a/service/callback/upload.go +++ b/service/callback/upload.go @@ -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) }