Este tópico descreve como copiar um objeto de um bucket de source para o mesmo ou para outro bucket de destino na mesma região.
Observações
Neste tópico, usamos o endpoint público da região China (Hangzhou). Para acessar o oss a partir de outros service da Alibaba Cloud na mesma região, use um endpoint interno. Para obter detalhes sobre as regiões e os endpoints compatíveis, consulte Regions and endpoints.
Neste tópico, obtenha as credenciais de acesso a partir de variáveis de ambiente. Para obter mais informações, consulte 配置访问凭证.
Este tópico demonstra como criar uma instância OSSClient com um endpoint do oss. Para configurações alternativas, como usar um domínio personalizado ou autenticar-se com credenciais do Security Token service (STS), consulte Client configuration.
É necessário ter permissões de leitura no objeto source e permissões de leitura e gravação no bucket de destino.
Os buckets source e de destino não devem ter políticas de retenção configuradas. Caso contrário, a cópia falha e o sistema retorna o erro The object you specified is immutable..
Não há suporte para cópia entre regiões. Por exemplo, não é possível copiar um objeto de um bucket em China (Hangzhou) para um bucket em China (Qingdao).
Permissões
Por padrão, uma conta Alibaba Cloud possui permissões totais. Usuários ou funções RAM vinculados a uma conta Alibaba Cloud não têm permissões por padrão. A conta Alibaba Cloud ou o administrador da conta deve conceder as permissões, ou defina as permissões de operação por meio de RAM policies ou Bucket Policy.
|
API |
Ação |
Descrição |
|
CopyObject |
|
Copia objetos dentro de um bucket ou entre buckets na mesma região. |
|
|
||
|
|
Caso a versão do objeto source seja especificada por meio do versionId, essa permissão também é necessária. |
|
|
|
Ao copiar tags do objeto por meio do x-oss-tagging, essas permissões são necessárias. |
|
|
|
||
|
|
Caso as tags de uma versão específica do objeto source sejam especificadas por meio do versionId, essa permissão também é necessária. |
|
|
|
Ao copiar um objeto, caso os metadados do objeto de destino contenham X-Oss-Server-Side-Encryption: KMS, essas duas permissões são necessárias. |
|
|
|
Código de exemplo
Use bucket.copy_object para copiar um objeto e especifique os metadados do objeto com o parâmetro :meta_directive. Durante uma operação de cópia, é possível tratar os metadados do objeto de uma das seguintes maneiras:
Caso o parâmetro meta não seja especificado, os metadados do objeto de destino serão iguais aos do objeto source.
Caso o parâmetro meta seja especificado, os metadados do objeto source serão substituídos pelos novos metadados.
O código a seguir mostra como copiar um objeto, execute o código para testar:
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Specify the Endpoint for the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 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.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Specify the bucket name. Example: examplebucket.
bucket = client.get_bucket('examplebucket')
# Copy the object and its metadata.
bucket.copy_object(
# In this example, srcobject.txt is copied as destobject.txt.
'destobject.txt', 'srcobject.txt',
:meta_directive => Aliyun::OSS::MetaDirective::COPY)
# Copy the object and overwrite its metadata.
bucket.copy_object(
'destobject.txt', 'srcobject.txt',
:metas => {'year' => '2017'},
:meta_directive => Aliyun::OSS::MetaDirective::REPLACE)
Referências
Para obter mais informações sobre a operação da API CopyObject, consulte CopyObject.