Todos os produtos
Search
Central de documentação

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

Última atualização: Jul 03, 2026

Use a operação UploadPartCopy do Object Storage Service (OSS) SDK for Go 2.0 para copiar um objeto de um bucket de origem para um bucket de destino na mesma região por meio de 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 da região cn-hangzhou, referente à região China (Hangzhou), e o endpoint público por padrão. Para acessar recursos usando outros serviços da Alibaba Cloud na mesma região do bucket, use o endpoint interno. Para obter mais informações sobre regiões e endpoints do OSS, consulte Regiões e endpoints.

  • As credenciais de acesso são obtidas de variáveis de ambiente. Para saber como configurar credenciais de acesso, consulte Configurar credenciais de acesso.

  • Para copiar um objeto, é necessário ter permissões de leitura no objeto de origem e permissões de leitura e gravação no bucket de destino.

  • Os buckets de origem e de destino devem estar na mesma região. Por exemplo, não é possível copiar objetos de um bucket na região China (Hangzhou) para outro bucket na região China (Qingdao).

  • Verifique se não há políticas de retenção configuradas nos buckets de origem e de destino. Caso contrário, o sistema retorna 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 solicitação

Parâmetro

Tipo

Descrição

ctx

context.Context

Contexto da solicitação. Use este parâmetro para definir um tempo limite para a requisição.

request

*UploadPartCopyRequest

Parâmetros da solicitação. Para mais detalhes, consulte UploadPartCopyRequest.

optFns

...func(*Options)

Parâmetros opcionais. Para mais detalhes, consulte Options.

Parâmetros de resposta

Parâmetro

Tipo

Descrição

result

*UploadPartCopyResult

Resposta da operação. Válido quando err é nil. Para mais detalhes, consulte UploadPartCopyResult.

err

error

Mensagem de erro. Um valor diferente de nil indica falha na solicitação.

Processo de cópia multipart

Para copiar um objeto usando cópia multipart, execute as etapas a seguir:

  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 enviar as partes.

    Nota
    • Nas partes enviadas por uma tarefa de upload multipart com um ID específico, os números das partes identificam suas posições relativas dentro do objeto. Se você fizer o upload de uma parte e reutilizar o mesmo número para enviar outra, a nova parte substituirá a 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 hashes forem diferentes, o OSS retornará o código de erro InvalidDigest.

  3. Conclua a tarefa de upload multipart.

    Após o envio 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 demonstra como copiar um objeto de um bucket de origem para um bucket de destino usando 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 acessar o código de exemplo completo de cópia multipart, visite o GitHub.

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

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

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