Este tópico descreve como usar o método CopyObject do OSS SDK for Go 2.0 para copiar um objeto com tamanho inferior a 5 GiB de um bucket de origem para um bucket de destino na mesma região. O bucket de destino pode ser o mesmo da origem ou um bucket diferente.
Observações de uso
O código de exemplo neste tópico usa o ID da região
cn-hangzhou, correspondente à região China (Hangzhou). Por padrão, o acesso aos recursos do bucket ocorre via endpoint público. Para acessar os recursos do bucket por meio de outros serviços da Alibaba Cloud na mesma região onde ele está localizado, use o endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regiões e endpoints.Neste tópico, as credenciais de acesso são obtidas a partir de variáveis de ambiente. Para saber mais sobre como configurar essas credenciais, consulte Configurar credenciais de acesso.
Para copiar um objeto, você precisa ter permissão de leitura no objeto de origem e permissões de leitura e escrita no bucket de destino.
Os buckets de origem e de destino devem estar localizados na mesma região. Por exemplo, não é possível copiar objetos de um bucket na região China (Hangzhou) para outro bucket situado 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.
Permissões
Por padrão, uma conta Alibaba Cloud tem permissões completas. Usuários RAM ou funções RAM vinculados a essa conta não têm nenhuma permissão inicialmente. A conta Alibaba Cloud ou o administrador da conta deve conceder as permissões operacionais necessárias por meio de políticas do RAM ou Bucket Policy.
|
API |
Ação |
Descrição |
|
CopyObject |
|
Copia objetos dentro de um mesmo bucket ou entre buckets na mesma região. |
|
|
||
|
|
Necessária também quando a versão do objeto de origem é especificada via versionId. |
|
|
|
Requeridas caso as tags do objeto sejam copiadas usando x-oss-tagging. |
|
|
|
||
|
|
Também exigida ao especificar as tags de uma versão específica do objeto de origem por meio de versionId. |
|
|
|
Ambas as permissões são obrigatórias se os metadados do objeto de destino contiverem X-Oss-Server-Side-Encryption: KMS durante a cópia. |
|
|
|
Método
func (c *Client) CopyObject(ctx context.Context, request *CopyObjectRequest, optFns ...func(*Options)) (*CopyObjectResult, error)
Parâmetros da solicitação
|
Parâmetro |
Tipo |
Descrição |
|
ctx |
context.Context |
Contexto da solicitação, usado para definir a duração total da operação. |
|
request |
*CopyObjectRequest |
Define os parâmetros específicos da operação da API. Para mais detalhes, consulte CopyObjectRequest. |
|
optFns |
...func(*Options) |
Parâmetros opcionais. Para mais informações, consulte Options. |
Parâmetros comuns do CopyObjectRequest
|
Parâmetro |
Tipo |
Descrição |
|
Bucket |
*string |
Nome do bucket de destino. |
|
Key |
*string |
Nome do objeto de destino. |
|
SourceBucket |
*string |
Nome do bucket de origem. |
|
SourceKey |
*string |
Nome do objeto de origem. |
|
ForbidOverwrite |
*string |
Define se a operação CopyObject pode sobrescrever um objeto existente com o mesmo nome. |
|
Tagging |
*string |
Tags do objeto de destino. É possível configurar múltiplas tags. Exemplo: TagA=A&TagB=B. |
|
TaggingDirective |
*string |
Método usado para configurar as tags do objeto de destino. Valores válidos:
|
Parâmetros de resposta
|
Parâmetro de resposta |
Tipo |
Descrição |
|
result |
*CopyObjectResult |
Resposta da operação. Este parâmetro é válido apenas quando err for nil. Consulte CopyObjectResult para mais detalhes. |
|
err |
error |
Status da solicitação. Se a operação falhar, o valor de err não será nil. |
Exemplo
O código abaixo demonstra como copiar um objeto com tamanho menor que 5 GiB de um bucket de origem para um bucket de destino:
package main
import (
"context"
"flag"
"log"
"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(®ion, "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()
// 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)
// Create a request to copy an object.
request := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // The name of the destination bucket.
Key: oss.Ptr(destObjectName), // The name of the destination object.
SourceKey: oss.Ptr(srcObjectName), // The name of the source object.
SourceBucket: oss.Ptr(srcBucketName), // The name of the source bucket.
}
// Copy the source object and process the results.
result, err := client.CopyObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to copy object %v", err)
}
log.Printf("copy object result:%#v\n", result)
}
Referências
Para acessar o código de exemplo completo sobre cópia de objetos, visite o GitHub.
Para obter mais informações sobre a operação da API usada para copiar objetos, consulte CopyObject.