Multipart Upload Overview
To upload a large file, multipart upload is recommended. Multipart upload is applicable to many scenarios, when:
- files to be uploaded are larger than 100 MB.
- the network condition is poor. Connection to the OBS server is constantly down.
- sizes of files to be uploaded are uncertain.
Multipart upload consists of three steps:
- Initialize a multipart upload (ObsClient.InitiateMultipartUpload).
- Upload parts one by one or concurrently (ObsClient.UploadPart).
- Combine parts (ObsClient.CompleteMultipartUpload) or abort the multipart upload (ObsClient.AbortMultipartUpload).
The following code shows how to perform multipart upload:
import ( "fmt" "obs" ) var ak = "*** Provide your Access Key ***" var sk = "*** Provide your Secret Key ***" var endpoint = "https://your-endpoint" // Create an ObsClient struct. var obsClient, _ = obs.New(ak, sk, endpoint) func main() { var uploadId = "" var eTag1 = "" var eTag2 = "" // Initialize a multipart upload. inputInit := &obs.InitiateMultipartUploadInput{} inputInit.Bucket = "bucketname" inputInit.Key = "objectkey" outputInit, err := obsClient.InitiateMultipartUpload(inputInit) if err == nil { fmt.Printf("RequestId:%s\n", outputInit.RequestId) fmt.Printf("UploadId:%s\n", outputInit.UploadId) uploadId = outputInit.UploadId } else { if obsError, ok := err.(obs.ObsError); ok { fmt.Println(obsError.Code) fmt.Println(obsError.Message) } else { fmt.Println(err) } } // Upload a part. inputUploadPart := &obs.UploadPartInput{} inputUploadPart.Bucket = "bucketname" inputUploadPart.Key = "objectkey" inputUploadPart.UploadId = uploadId inputUploadPart.PartNumber = "partNumber1" inputUploadPart.SourceFile = "localFilePath" outputUploadPart, err := obsClient.UploadPart(inputUploadPart) if err == nil { fmt.Printf("RequestId:%s\n", outputUploadPart.RequestId) fmt.Printf("ETag:%s\n", outputUploadPart.ETag) eTag1 = outputUploadPart.ETag } else { if obsError, ok := err.(obs.ObsError); ok { fmt.Println(obsError.Code) fmt.Println(obsError.Message) } else { fmt.Println(err) } } inputUploadPart = &obs.UploadPartInput{} inputUploadPart.Bucket = "bucketname" inputUploadPart.Key = "objectkey" inputUploadPart.UploadId = uploadId inputUploadPart.PartNumber = "partNumber2" inputUploadPart.SourceFile = "localFilePath" outputUploadPart, err = obsClient.UploadPart(inputUploadPart) if err == nil { fmt.Printf("RequestId:%s\n", outputUploadPart.RequestId) fmt.Printf("ETag:%s\n", outputUploadPart.ETag) eTag2 = outputUploadPart.ETag } else { if obsError, ok := err.(obs.ObsError); ok { fmt.Println(obsError.Code) fmt.Println(obsError.Message) } else { fmt.Println(err) } } // Combine parts. inputCompleteMultipart := &obs.CompleteMultipartUploadInput{} inputCompleteMultipart.Bucket = "bucketname" inputCompleteMultipart.Key = "objectkey" inputCompleteMultipart.UploadId = uploadId inputCompleteMultipart.Parts = []obs.Part{ obs.Part{PartNumber: "partNumber1", ETag: eTag1}, obs.Part{PartNumber: "partNumber2", ETag: eTag2}, } outputCompleteMultipart, err := obsClient.CompleteMultipartUpload(inputCompleteMultipart) if err == nil { fmt.Printf("RequestId:%s\n", outputCompleteMultipart.RequestId) fmt.Printf("Location:%s, Bucket:%s, Key:%s, ETag:%s\n", outputCompleteMultipart.Location, outputCompleteMultipart.Bucket, outputCompleteMultipart.Key, outputCompleteMultipart.ETag) } else { if obsError, ok := err.(obs.ObsError); ok { fmt.Println(obsError.Code) fmt.Println(obsError.Message) } else { fmt.Println(err) } } }
For details about other operations of multipart upload, see:
Last Article: APIs Related to Multipart Upload
Next Article: Initializing a Multipart Upload
Did this article solve your problem?
Thank you for your score!Your feedback would help us improve the website.