Tüm Ürünler
Search
Belge Merkezi

Object Storage Service:Multipart upload (Go SDK V1)

Son Güncelleme:Oct 01, 2026

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:PutObject iznine 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:

  1. Ç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.

  2. Parçaları yükleyin.

    Her parça için verileri yüklemek amacıyla Bucket.UploadPart yöntemini çağırabilirsiniz.

    Not
    • Aynı 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.

  3. Ç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?

Aşağıdaki senaryolarda bir çok parçalı yükleme olayını iptal etmek için Bucket.AbortMultipartUpload yöntemini kullanabilirsiniz.

  1. Dosya hatası:

    • Yükleme sırasında bir dosyanın bozuk olduğunu veya kötü amaçlı kod içerdiğini tespit ederseniz potansiyel tehditleri önlemek için yüklemeyi iptal edebilirsiniz.

  2. Kararsız ağ:

    • Ağ bağlantısı kararsızsa veya kesintiye uğrarsa yükleme sırasında parçalar kaybolabilir veya bozulabilir. Veri bütünlüğünü ve tutarlılığını sağlamak için yüklemeyi iptal edip yeniden başlatabilirsiniz.

  3. Kaynak sınırlamaları:

    • Depolama alanınız sınırlıysa ve yüklenecek dosya çok büyükse depolama kaynaklarını serbest bırakmak için yüklemeyi iptal edebilirsiniz. Bu sayede kaynakları daha önemli görevlere ayırabilirsiniz.

  4. Kaza sonucu işlem:

    • Gereksiz bir yükleme görevini yanlışlıkla başlatırsanız veya hatalı bir dosya sürümü yüklerseniz yükleme olayını iptal edebilirsiniz.

...
if err = bucket.AbortMultipartUpload(imur); err != nil {
log.Fatalf("failed to abort multipart upload: %w", err)
}

log.Printf("Multipart upload aborted successfully.")

Yüklenen parçaları nasıl listelerim?

Belirli bir çok parçalı yükleme olayı için başarıyla yüklenen parçaları aşağıdaki senaryolarda listelemek üzere Bucket.ListUploadedParts yöntemini kullanabilirsiniz.

Yükleme ilerlemesini izleme:

  1. Büyük dosya yüklemeleri:

    • Büyük bir dosya yüklerken yüklemenin beklendiği gibi ilerlediğinden emin olmak ve sorunları hızla tespit etmek için yüklenen parçaları listeleyebilirsiniz.

  2. Kaldığı yerden devam eden yüklemeler:

    • Ağ kararsızsa veya yükleme kesintiye uğrarsa kalan parçaların yeniden yüklenip yüklenmeyeceğine karar vermek için yüklenen parçaları görüntüleyebilirsiniz. Bu, yüklemeye kaldığı yerden devam etmenize yardımcı olur.

  3. Sorun giderme:

    • Yükleme sırasında bir hata oluşursa sorunun kaynağını hızlıca bulmak için yüklenen parçaları kontrol edebilirsiniz. Örneğin belirli bir parça yüklenemediyse sorunu buna göre ele alabilirsiniz.

  4. Kaynak yönetimi:

    • Kaynak kullanımını sıkı şekilde kontrol etmeniz gereken senaryolarda depolama alanı ve bant genişliği kaynaklarını daha iyi yönetmek için yükleme ilerlemesini izleyebilirsiniz. Bu, kaynakların verimli kullanılmasını sağlar.

...	
if lsRes, err := bucket.ListUploadedParts(imur); err != nil {
log.Fatalf("Failed to list uploaded parts: %v", err)
}

for _, upload := range lsRes.UploadedParts {
log.Printf("List PartNumber: %d, ETag: %s, LastModified: %v\n", upload.PartNumber, upload.ETag, upload.LastModified)
}

Çok parçalı yükleme olaylarını listeleme

Bir paket içindeki devam eden tüm çok parçalı yükleme olaylarını aşağıdaki senaryolarda listelemek için Bucket.ListMultipartUploads yöntemini kullanabilirsiniz.

İzleme senaryoları:

  1. Toplu dosya yükleme yönetimi:

    • Çok sayıda dosya yüklemeniz gerektiğinde ListMultipartUploads yöntemini kullanarak tüm çok parçalı yükleme etkinliklerini gerçek zamanlı olarak izleyebilirsiniz. Bu, tüm dosyaların doğru şekilde parça parça yüklendiğini garanti eder.

  2. Arıza tespiti ve kurtarma:

    • Yükleme sırasında ağ sorunları veya diğer arızalar meydana gelirse bazı parçalar yüklenemeyebilir. Devam eden çok parçalı yükleme olaylarını izleyerek bu sorunları hızla tespit edebilir ve yüklemelere kaldığı yerden devam etmek için önlem alabilirsiniz.

  3. Kaynak optimizasyonu ve yönetimi:

    • Büyük ölçekli dosya yüklemeleri sırasında devam eden çok parçalı yükleme olaylarını izlemek kaynak tahsisini optimize etmenize yardımcı olabilir. Örneğin yükleme ilerlemesine göre bant genişliği kullanımını ayarlayabilir veya yükleme ilkesini optimize edebilirsiniz.

  4. Veri geçişi:

    • Büyük ölçekli bir veri geçişi projesi yürütürken geçiş görevinin sorunsuz ilerlemesini sağlamak için devam eden tüm çok parçalı yükleme olaylarını izleyebilirsiniz. Bu, potansiyel sorunları hızla tespit edip çözmenizi sağlar.

Parametre ayarları

Parametre

Açıklama

Sınırlayıcı

Nesne adlarını gruplamak için kullanılan karakter. Belirtilen öneki içeren ve sınırlayıcı karakterin ilk geçtiği yere kadar olan tüm nesne adları tek bir öğe olarak gruplanır.

MaxUploads

Döndürülecek maksimum çok parçalı yükleme olayı sayısı. Varsayılan değer ve maksimum değer her ikisi de 1000'dir.

KeyMarker

Nesne adları sözlüksel olarak KeyMarker parametresinin değerinden büyük olan çok parçalı yükleme olayları. Döndürülecek sonuçların başlangıç konumunu belirtmek için bu parametreyi UploadIDMarker parametresiyle birlikte kullanabilirsiniz.

Önek

Döndürülen nesne adlarının içermesi gereken önek. Bir sorguda Önek parametresini kullanırsanız döndürülen nesne adlarının yine de öneki içerdiğini unutmayın.

UploadIDMarker

Döndürülecek sonuçların başlangıç konumu. Bu parametre KeyMarker parametresiyle birlikte kullanılır.

  • KeyMarker parametresi ayarlanmamışsa OSS bu parametreyi yok sayar.

  • KeyMarker parametresi ayarlanmışsa sorgu sonuçları şunları içerir:

    • Nesne adları sözlüksel olarak KeyMarker parametresinin değerinden büyük olan çok parçalı yükleme olayları.

    • Nesne adları KeyMarker parametresinin değeriyle aynı ancak yükleme kimlikleri UploadIDMarker parametresinin değerinden büyük olan çok parçalı yükleme olayları.

  • Varsayılan parametreleri kullanın.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.KeyMarker(keyMarker), oss.UploadIDMarker(uploadIdMarker))
    if err != nil {
    log.Fatalf("failed to list multipart uploads: %w", err)
    }
    
    for _, upload := range lsRes.Uploads {
    log.Printf("Upload: %s, UploadID: %s\n", upload.Key, upload.UploadID)
    }
  • Öneki file olarak belirtin.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix('file'))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • Maksimum 100 sonucun döndürülmesini belirtin.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • Öneki file olarak belirtin ve maksimum 100 sonucun döndürülmesini sağlayın.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix("file"), oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix and limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)

İ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.