From 46897e288018e96fa1dc38628216d691e0c66ed5 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 14 Oct 2025 10:21:43 +0800 Subject: [PATCH] fix(oss): presigned multipart upload mismatch --- assets | 2 +- pkg/filemanager/driver/oss/oss.go | 33 ++++++++++++++++++++----------- pkg/filemanager/fs/fs.go | 4 ++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/assets b/assets index 71e5fbd..1c38544 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 71e5fbd240824ad0b6e8ebe5e47d25704a82d7c4 +Subproject commit 1c38544ef7fd51b4404797cf57355795c28683c1 diff --git a/pkg/filemanager/driver/oss/oss.go b/pkg/filemanager/driver/oss/oss.go index 363895e..178eca7 100644 --- a/pkg/filemanager/driver/oss/oss.go +++ b/pkg/filemanager/driver/oss/oss.go @@ -65,12 +65,8 @@ type Driver struct { type key int const ( - chunkRetrySleep = time.Duration(5) * time.Second - uploadIdParam = "uploadId" - partNumberParam = "partNumber" - callbackParam = "callback" - completeAllHeader = "x-oss-complete-all" - maxDeleteBatch = 1000 + chunkRetrySleep = time.Duration(5) * time.Second + maxDeleteBatch = 1000 // MultiPartUploadThreshold 服务端使用分片上传的阈值 MultiPartUploadThreshold int64 = 5 * (1 << 30) // 5GB @@ -530,6 +526,11 @@ func (handler *Driver) Token(ctx context.Context, uploadSession *fs.UploadSessio UploadId: imur.UploadId, PartNumber: int32(c.Index() + 1), Body: chunk, + RequestCommon: oss.RequestCommon{ + Headers: map[string]string{ + "Content-Type": "application/octet-stream", + }, + }, }, oss.PresignExpires(ttl)) if err != nil { return err @@ -545,12 +546,19 @@ func (handler *Driver) Token(ctx context.Context, uploadSession *fs.UploadSessio // 签名完成分片上传的URL completeURL, err := handler.client.Presign(ctx, &oss.CompleteMultipartUploadRequest{ - Bucket: &handler.policy.BucketName, - Key: &file.Props.SavePath, - UploadId: imur.UploadId, - CompleteAll: oss.Ptr("yes"), - ForbidOverwrite: oss.Ptr(strconv.FormatBool(true)), - Callback: oss.Ptr(callbackPolicyEncoded), + Bucket: &handler.policy.BucketName, + Key: &file.Props.SavePath, + UploadId: imur.UploadId, + RequestCommon: oss.RequestCommon{ + Parameters: map[string]string{ + "callback": callbackPolicyEncoded, + }, + Headers: map[string]string{ + "Content-Type": "application/octet-stream", + "x-oss-complete-all": "yes", + "x-oss-forbid-overwrite": "true", + }, + }, }, oss.PresignExpires(ttl)) if err != nil { return nil, err @@ -562,6 +570,7 @@ func (handler *Driver) Token(ctx context.Context, uploadSession *fs.UploadSessio CompleteURL: completeURL.URL, SessionID: uploadSession.Props.UploadSessionID, ChunkSize: handler.chunkSize, + Callback: callbackPolicyEncoded, }, nil } diff --git a/pkg/filemanager/fs/fs.go b/pkg/filemanager/fs/fs.go index 20681d6..8536c98 100644 --- a/pkg/filemanager/fs/fs.go +++ b/pkg/filemanager/fs/fs.go @@ -244,8 +244,8 @@ type ( UploadURLs []string `json:"upload_urls,omitempty"` Credential string `json:"credential,omitempty"` UploadID string `json:"uploadID,omitempty"` - Callback string `json:"callback,omitempty"` // 回调地址 - Uri string `json:"uri,omitempty"` // 存储路径 + Callback string `json:"callback,omitempty"` + Uri string `json:"uri,omitempty"` // 存储路径 AccessKey string `json:"ak,omitempty"` KeyTime string `json:"keyTime,omitempty"` // COS用有效期 CompleteURL string `json:"completeURL,omitempty"`