Todos os produtos
Search
Central de documentação

Object Storage Service:Cópia multipart usando o OSS SDK for Go 2.0

Última atualização: Sep 22, 2026

A operação UploadPartCopy do Object Storage Service (OSS) SDK for Go 2.0 permite copiar um objeto de um bucket de origem para um bucket de destino na mesma região por meio da cópia multipart. O bucket de destino pode ser igual ou diferente do bucket de origem.

Observações de uso

  • O código de exemplo usa o ID de região cn-hangzhou da região China (Hangzhou) e o endpoint público por padrão. Para acessar recursos por meio de outros serviços da Alibaba Cloud na mesma região do bucket, use o endpoint interno. Para obter mais informações sobre as regiões e endpoints do OSS, consulte Regions and endpoints.

  • As credenciais de acesso são obtidas a partir de variáveis de ambiente. Para obter mais informações sobre como configurar as credenciais de acesso, consulte Configure access credentials.

  • Para copiar um objeto, você precisa ter permissões de leitura no objeto de origem e permissões de leitura e gravação no bucket de destino.

  • O bucket de origem e o bucket de destino devem estar localizados na mesma região. Por exemplo, objetos em um bucket localizado na região China (Hangzhou) não podem ser copiados para outro bucket localizado na região China (Qingdao).

  • Certifique-se de que não há políticas de retenção configuradas para o bucket de origem e o bucket de destino. Caso contrário, o sistema retornará a seguinte mensagem de erro: The object you specified is immutable.

Método

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

Parâmetros da requisição

Parâmetro

Tipo

Descrição

ctx

context.Context

O contexto da requisição. Defina um tempo limite para a requisição usando este parâmetro.

request

*UploadPartCopyRequest

Os parâmetros da requisição. Para obter mais informações, consulte UploadPartCopyRequest.

optFns

...func(*Options)

Parâmetros opcionais. Para obter mais informações, consulte Options.

Parâmetros de resposta

Parâmetro

Tipo

Descrição

result

*UploadPartCopyResult

A resposta da operação. Válido quando err é nil. Para obter mais informações, consulte UploadPartCopyResult.

err

error

A mensagem de erro. Um valor diferente de nil indica que a requisição falhou.

Processo de cópia multipart

Execute as seguintes etapas para copiar um objeto usando a cópia multipart:

  1. Inicie uma tarefa de upload multipart.

    Use o método Client.InitiateMultipartUpload para obter um ID de upload exclusivo no OSS.

  2. Faça o upload das partes.

    Use o método Client.UploadPartCopy para fazer o upload das partes.

    Nota
    • Para as partes que são enviadas ao executar uma tarefa de upload multipart com um ID de upload específico, os números das partes identificam suas posições relativas em um objeto. Se você fizer o upload de uma parte e reutilizar o número dela para enviar outra parte, a nova parte substituirá a parte original.

    • O OSS inclui o hash MD5 de cada parte enviada no cabeçalho ETag da resposta.

    • O OSS calcula o hash MD5 das partes enviadas e o compara com o hash MD5 calculado pelo OSS SDK for Go. Se os dois hashes forem diferentes, o OSS retornará o código de erro InvalidDigest.

  3. Conclua a tarefa de upload multipart.

    Após o upload de todas as partes, use o método Client.CompleteMultipartUpload para combinar essas partes em um objeto completo.

Exemplos

O código de exemplo a seguir mostra como copiar um objeto de um bucket de origem para um bucket de destino usando a cópia multipart e combinar as partes em um objeto completo:

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)
}

Referências

  • Para obter o código de exemplo completo para cópia multipart, visite o GitHub.

  • Para obter mais informações sobre a operação InitiateMultipartUpload, visite InitiateMultipartUpload.

  • Para obter mais informações sobre a operação UploadPartCopy, visite UploadPartCopy.

  • Para obter mais informações sobre a operação CompleteMultipartUpload, visite CompleteMultipartUpload.