diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index 2f738ebadc..167cd0488b 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -2,6 +2,7 @@ package storage import ( "encoding/xml" + "errors" "path" "sort" "strconv" @@ -129,7 +130,7 @@ func NewMultiPartUpload(uuid string) (string, error) { return core.NewMultipartUpload(bucketName, objectName, miniov6.PutObjectOptions{}) } -func CompleteMultiPartUpload(uuid string, uploadID string) (string, error) { +func CompleteMultiPartUpload(uuid string, uploadID string, totalChunks int) (string, error) { client, core, err := getClients() if err != nil { log.Error("getClients failed:", err.Error()) @@ -146,6 +147,11 @@ func CompleteMultiPartUpload(uuid string, uploadID string) (string, error) { return "", err } + if len(partInfos) != totalChunks { + log.Error("ListObjectParts number(%d) is not equal the set total chunk number(%d)", len(partInfos), totalChunks) + return "", errors.New("the parts is not complete") + } + var complMultipartUpload completeMultipartUpload for _, partInfo := range partInfos { complMultipartUpload.Parts = append(complMultipartUpload.Parts, miniov6.CompletePart{ diff --git a/modules/storage/obs.go b/modules/storage/obs.go index 2b52ab603e..03349864ac 100755 --- a/modules/storage/obs.go +++ b/modules/storage/obs.go @@ -85,7 +85,7 @@ func listAllParts(uuid, uploadID, key string) (output *obs.ListPartsOutput, err }) } - if len(temp.Parts) < temp.MaxParts { + if !temp.IsTruncated { break } else { continue @@ -128,7 +128,7 @@ func NewObsMultiPartUpload(uuid, fileName string) (string, error) { return output.UploadId, nil } -func CompleteObsMultiPartUpload(uuid, uploadID, fileName string) error { +func CompleteObsMultiPartUpload(uuid, uploadID, fileName string, totalChunks int) error { input := &obs.CompleteMultipartUploadInput{} input.Bucket = setting.Bucket input.Key = strings.TrimPrefix(path.Join(setting.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid, fileName)), "/") @@ -140,6 +140,11 @@ func CompleteObsMultiPartUpload(uuid, uploadID, fileName string) error { return err } + if len(allParts.Parts) != totalChunks { + log.Error("listAllParts number(%d) is not equal the set total chunk number(%d)", len(allParts.Parts), totalChunks) + return errors.New("the parts is not complete") + } + input.Parts = allParts.Parts output, err := ObsCli.CompleteMultipartUpload(input) diff --git a/routers/repo/attachment.go b/routers/repo/attachment.go index ccedbdf1bd..aa52a1400c 100755 --- a/routers/repo/attachment.go +++ b/routers/repo/attachment.go @@ -855,13 +855,13 @@ func CompleteMultipart(ctx *context.Context) { } if typeCloudBrain == models.TypeCloudBrainOne { - _, err = storage.CompleteMultiPartUpload(uuid, uploadID) + _, err = storage.CompleteMultiPartUpload(uuid, uploadID, fileChunk.TotalChunks) if err != nil { ctx.Error(500, fmt.Sprintf("CompleteMultiPartUpload failed: %v", err)) return } } else { - err = storage.CompleteObsMultiPartUpload(uuid, uploadID, fileName) + err = storage.CompleteObsMultiPartUpload(uuid, uploadID, fileName, fileChunk.TotalChunks) if err != nil { ctx.Error(500, fmt.Sprintf("CompleteObsMultiPartUpload failed: %v", err)) return diff --git a/web_src/js/components/MinioUploader.vue b/web_src/js/components/MinioUploader.vue index 95f5e7e593..b47700e205 100755 --- a/web_src/js/components/MinioUploader.vue +++ b/web_src/js/components/MinioUploader.vue @@ -193,6 +193,9 @@ export default { const time = new Date().getTime(); this.status = this.dropzoneParams.data('md5-computing'); file.totalChunkCounts = chunks; + if (file.size==0) { + file.totalChunkCounts = 1 + } loadMd5Next(); fileReader.onload = (e) => { diff --git a/web_src/js/index.js b/web_src/js/index.js index c558e76242..59024912d8 100755 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -3878,7 +3878,7 @@ function initVueDataset() { }, }, components: { - MinioUploader, + MinioUploader }, mounted(){ // if(document.getElementById('postPath')){ @@ -4403,7 +4403,6 @@ function initVueDataAnalysis() { render: h => h(DataAnalysis) }); } - function initVueWxAutorize() { const el = document.getElementById('WxAutorize'); if (!el) {