Object Storage Service (OSS), büyük nesneler için çok parçalı yükleme özelliği sunar. Bu süreçte büyük bir nesne daha küçük parçalara bölünür, parçalar bağımsız olarak yüklenir ve ardından parçaları tek bir nesne halinde birleştirmek için CompleteMultipartUpload API'si çağrılır. Bu sayede yüklemelerin kaldığı yerden devam etmesi mümkün olur.
Notlar
Bu konuda Çin (Hangzhou) bölgesinin genel uç noktası kullanılmaktadır. OSS ile aynı bölgedeki diğer Alibaba Cloud hizmetlerinden OSS'ye erişmek istiyorsanız dahili uç noktayı kullanın. OSS bölgeleri ve uç noktaları hakkında daha fazla bilgi için bkz. Bölgeler ve uç noktalar.
Bu konuda erişim kimlik bilgileri ortam değişkenlerinden alınır. Erişim kimlik bilgilerinin nasıl yapılandırılacağı hakkında daha fazla bilgi için bkz. Erişim kimlik bilgilerini yapılandırma.
Bu konuda bir OSS uç noktası kullanarak bir OSSClient örneğinin nasıl oluşturulacağı gösterilmektedir. Özel bir alan adı kullanma veya Security Token Service (STS) kimlik bilgileriyle kimlik doğrulama gibi alternatif yapılandırmalar için bkz. İstemci yapılandırma (Go SDK V1).
Çok parçalı yükleme InitiateMultipartUpload, UploadPart ve CompleteMultipartUpload işlemlerini kullanır.
oss:PutObjectiznine sahip olmanız gerekir. RAM kullanıcıya özel erişim ilkeleri atama.Bu konudaki örnek kod, Go SDK V2.2.5 veya sonraki bir sürümü gerektirir.
Çok parçalı yükleme prosedürü
Çok parçalı yükleme üç adımdan oluşur:
-
Çok parçalı yüklemeyi başlatın.
Bucket.InitiateMultipartUpload yöntemini çağırabilirsiniz. OSS, genel olarak benzersiz bir yükleme kimliği döndürür.
-
Parçaları yükleyin.
Her parça için verileri yüklemek amacıyla Bucket.UploadPart yöntemini çağırabilirsiniz.
NotAynı yükleme kimliği için parça numarası, nesne içindeki bir parçanın göreli konumunu belirler. Aynı parça numarasını kullanarak yeni veri yüklerseniz OSS'deki mevcut parça verilerinin üzerine yazılır.
OSS, alınan parça verilerinin MD5 karmasını ETag üst bilgisinde döndürür.
OSS, yüklenen verilerin MD5 karmasını hesaplar ve bunu SDK'nın hesapladığı MD5 karmasıyla karşılaştırır. İki MD5 karması eşleşmezse InvalidDigest hata kodu döndürülür.
-
Çok parçalı yüklemeyi tamamlayın.
Tüm parçalar yüklendikten sonra tüm parçaları eksiksiz bir nesne halinde birleştirmek için Bucket.CompleteMultipartUpload yöntemini çağırabilirsiniz.
Örnek kod
Tam bir çok parçalı yükleme işlemi gerçekleştirmek için aşağıdaki kodu kullanabilirsiniz.
package main
import (
"fmt"
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error: %v", err)
}
// Create an OSSClient instance.
// Set yourEndpoint to the endpoint of the bucket. For example, for a bucket in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed.
// Set yourRegion to the region where the bucket is located. For example, for a bucket in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Set the signature version.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error: %v", err)
}
// Set the bucket name.
bucketName := "examplebucket"
// Set the full path of the object. The full path cannot contain the bucket name.
objectName := "exampleobject.txt"
// Set the full path of the local file. If you do not specify a local path, the file is uploaded from the local path that corresponds to the project of the sample program.
localFilename := "/localpath/exampleobject.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Error: %v", err)
}
// Set the part size in bytes. In this example, the part size is set to 5 MB.
partSize := int64(5 * 1024 * 1024)
// Call the multipart upload function.
if err := uploadMultipart(bucket, objectName, localFilename, partSize); err != nil {
log.Fatalf("Failed to upload multipart: %v", err)
}
}
// Multipart upload function.
func uploadMultipart(bucket *oss.Bucket, objectName, localFilename string, partSize int64) error {
// Split the local file into parts.
chunks, err := oss.SplitFileByPartSize(localFilename, partSize)
if err != nil {
return fmt.Errorf("failed to split file into chunks: %w", err)
}
// Open the local file.
file, err := os.Open(localFilename)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
// Step 1: Initialize a multipart upload event.
imur, err := bucket.InitiateMultipartUpload(objectName)
if err != nil {
return fmt.Errorf("failed to initiate multipart upload: %w", err)
}
// Step 2: Upload parts.
var parts []oss.UploadPart
for _, chunk := range chunks {
part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
if err != nil {
// If a part fails to be uploaded, try to abort the multipart upload task.
if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
log.Printf("Failed to abort multipart upload: %v", abortErr)
}
return fmt.Errorf("failed to upload part: %w", err)
}
parts = append(parts, part)
}
// Set the access control list (ACL) of the object to private. By default, the ACL of the object is inherited from the bucket.
objectAcl := oss.ObjectACL(oss.ACLPrivate)
// Step 3: Complete the multipart upload.
_, err = bucket.CompleteMultipartUpload(imur, parts, objectAcl)
if err != nil {
// If the upload fails to be completed, try to abort the upload.
if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
log.Printf("Failed to abort multipart upload: %v", abortErr)
}
return fmt.Errorf("failed to complete multipart upload: %w", err)
}
log.Printf("Multipart upload completed successfully.")
return nil
}
SSS
Bir çok parçalı yükleme olayını nasıl iptal ederim?
Yüklenen parçaları nasıl listelerim?
Çok parçalı yükleme olaylarını listeleme
İlgili bağlantılar
Çok parçalı yükleme için tam örnek kodu görmek için GitHub örneği adresine bakın.
-
Tam bir çok parçalı yükleme üç API işlemini içerir. Bu işlemler hakkında daha fazla bilgi için aşağıdaki konulara bakın:
Bir çok parçalı yükleme olayını başlatmak için kullanılan API işlemi hakkında daha fazla bilgi için bkz. InitiateMultipartUpload.
Bir parça yüklemek için kullanılan API işlemi hakkında daha fazla bilgi için bkz. UploadPart.
Bir çok parçalı yüklemeyi tamamlamak için kullanılan API işlemi hakkında daha fazla bilgi için bkz. CompleteMultipartUpload.
Bir çok parçalı yükleme olayını iptal etmek için kullanılan API işlemi hakkında daha fazla bilgi için bkz. AbortMultipartUpload.
Yüklenen parçaları listelemek için kullanılan API işlemi hakkında daha fazla bilgi için bkz. ListUploadedParts.
Devam eden tüm çok parçalı yükleme olaylarını (başlatılmış ancak henüz tamamlanmamış veya iptal edilmemiş olayları) listelemek için kullanılan API işlemi hakkında daha fazla bilgi için bkz. ListMultipartUploads.