Tous les produits
Search
Centre de documentation

Object Storage Service:Copie multipart à l'aide du SDK OSS pour Go 2.0

Dernière mise à jour :Sep 22, 2026

L'opération UploadPartCopy du SDK Object Storage Service (OSS) pour Go 2.0 permet de copier un objet d'un bucket source vers un bucket de destination dans la même région par copie multipart. Le bucket de destination peut être identique ou différent du bucket source.

Remarques sur l'utilisation

  • L'exemple de code utilise par défaut l'ID de région cn-hangzhou de la région Chine (Hangzhou) et le point de terminaison public. Pour accéder aux ressources via d'autres services Alibaba Cloud situés dans la même région que le bucket, utilisez le point de terminaison interne. Pour plus d'informations sur les régions et les points de terminaison OSS, consultez la rubrique Régions et points de terminaison.

  • Les informations d'identification d'accès sont récupérées depuis les variables d'environnement. Pour savoir comment configurer ces informations d'identification, reportez-vous à la section Configuration des informations d'identification d'accès.

  • Pour copier un objet, vous devez disposer des autorisations de lecture sur l'objet source ainsi que des autorisations de lecture et d'écriture sur le bucket de destination.

  • Le bucket source et le bucket de destination doivent se trouver dans la même région. Par exemple, il est impossible de copier des objets d'un bucket situé dans la région Chine (Hangzhou) vers un autre bucket situé dans la région Chine (Qingdao).

  • Assurez-vous qu'aucune politique de conservation n'est configurée pour le bucket source ni pour le bucket de destination. Dans le cas contraire, le message d'erreur suivant s'affiche : The object you specified is immutable.

Méthode

func (c *Client) UploadPartCopy(ctx context.Context, request *UploadPartCopyRequest, optFns ...func(*Options)) (*UploadPartCopyResult, error)

Paramètres de requête

Paramètre

Type

Description

ctx

context.Context

Contexte de la requête, permettant notamment de définir un délai d'expiration.

request

*UploadPartCopyRequest

Paramètres de la requête. Pour plus de détails, consultez la documentation UploadPartCopyRequest.

optFns

...func(*Options)

Paramètres optionnels. Pour plus de détails, consultez la documentation Options.

Paramètres de réponse

Paramètre

Type

Description

result

*UploadPartCopyResult

Réponse de l'opération. Valide lorsque err est nul. Pour plus de détails, consultez la documentation UploadPartCopyResult.

err

error

Message d'erreur. Une valeur non nulle indique l'échec de la requête.

Processus de copie multipart

Pour copier un objet via une copie multipart, procédez comme suit :

  1. Initiez une tâche de téléchargement multipart.

    Utilisez la méthode Client.InitiateMultipartUpload pour obtenir un ID de téléchargement unique dans OSS.

  2. Téléchargez les parties.

    Utilisez la méthode Client.UploadPartCopy pour télécharger les parties.

    Remarque
    • Pour les parties téléchargées lors d'une tâche de téléchargement multipart associée à un ID de téléchargement spécifique, les numéros de partie identifient leur position relative au sein de l'objet. Si vous téléchargez une partie puis réutilisez son numéro de partie pour en télécharger une autre, la nouvelle partie écrase la précédente.

    • OSS inclut le hachage MD5 de chaque partie téléchargée dans l'en-tête ETag de la réponse.

    • OSS calcule le hachage MD5 des parties téléchargées et le compare au hachage MD5 calculé par le SDK OSS pour Go. En cas de divergence, OSS renvoie le code d'erreur InvalidDigest.

  3. Finalisez la tâche de téléchargement multipart.

    Une fois toutes les parties téléchargées, utilisez la méthode Client.CompleteMultipartUpload pour assembler ces parties en un objet complet.

Exemples

L'exemple de code suivant illustre la copie d'un objet d'un bucket source vers un bucket de destination par copie multipart, ainsi que l'assemblage des parties en un objet complet :

package main

import (
	"context"
	"flag"
	"log"
	"sync"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// Specify the global variables.
var (
	region         string // The region.
	srcBucketName string // The name of the source bucket.
	srcObjectName string // The name of the source object.
	destBucketName string // The name of the destination bucket.
	destObjectName string // The name of the destination object.
)

// Specify the init function used to initialize command line parameters.
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// Parse command line parameters.
	flag.Parse()

	// Specify the upload ID.
	var uploadId string

	// Check whether the source bucket name is empty.
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// Check whether the region is empty.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// If the destination bucket name is not specified, the source bucket name is used.
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// Check whether the source object name is empty.
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// Check whether the destination object name is empty.
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// Load the default configurations and specify the credential provider and region.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Create an OSS client.
	client := oss.NewClient(cfg)

	// Initialize the multipart upload request.
	initRequest := &oss.InitiateMultipartUploadRequest{
		Bucket: oss.Ptr(destBucketName),
		Key:    oss.Ptr(destObjectName),
	}
	initResult, err := client.InitiateMultipartUpload(context.TODO(), initRequest)
	if err != nil {
		log.Fatalf("failed to initiate multipart upload %v", err)
	}

	// Display the result of multipart copy.
	log.Printf("initiate multipart upload result:%#v\n", *initResult.UploadId)
	uploadId = *initResult.UploadId

	// Initialize the wait group and mutual exclusion (mutex).
	var wg sync.WaitGroup
	var parts []oss.UploadPart
	count := 3
	var mu sync.Mutex

	// Start multiple goroutines for multipart upload.
	for i := 0; i < count; i++ {
		wg.Add(1)
		go func(partNumber int, i int) {
			defer wg.Done()

			// Create the multipart upload request.
			partRequest := &oss.UploadPartCopyRequest{
				Bucket:       oss.Ptr(destBucketName), // The name of the destination bucket.
				Key:          oss.Ptr(destObjectName), // The name of the destination object.
				SourceBucket: oss.Ptr(srcBucketName), // The name of the source bucket.
				SourceKey:     oss.Ptr(srcObjectName), // The name of the source object.
				PartNumber: int32(partNumber), // The part number.
				const uploadId = '<Upload Id>'; // The upload ID of the multipart upload task.
			}

			// Send the multipart upload request.
			partResult, err := client.UploadPartCopy(context.TODO(), partRequest)
			if err != nil {
				log.Fatalf("failed to upload part copy %d: %v", partNumber, err)
			}

			// Record the multipart upload result.
			part := oss.UploadPart{
				PartNumber: partRequest.PartNumber,
				ETag:       partResult.ETag,
			}

			// Use the mutex to protect shared data.
			mu.Lock()
			parts = append(parts, part)
			mu.Unlock()
		}(i+1, i)
	}

	// Wait until all goroutines are complete.
	wg.Wait()

	// Complete the multipart upload request.
	request := &oss.CompleteMultipartUploadRequest{
		Bucket:   oss.Ptr(destBucketName),
		Key:      oss.Ptr(destObjectName),
		UploadId: oss.Ptr(uploadId),
		CompleteMultipartUpload: &oss.CompleteMultipartUpload{
			Parts: parts,
		},
	}
	result, err := client.CompleteMultipartUpload(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to complete multipart upload %v", err)
	}

	// Display the result.
	log.Printf("complete multipart upload result:%#v\n", result)
}

Références

  • Pour consulter l'exemple de code complet relatif à la copie multipart, rendez-vous sur GitHub.

  • Pour plus d'informations sur l'opération InitiateMultipartUpload, consultez la documentation InitiateMultipartUpload.

  • Pour plus d'informations sur l'opération UploadPartCopy, consultez la documentation UploadPartCopy.

  • Pour plus d'informations sur l'opération CompleteMultipartUpload, consultez la documentation CompleteMultipartUpload.