Este tópico descreve como usar o método CopyObject do OSS SDK for Python versão 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 bucket de origem ou um bucket diferente.
Observações
O código de exemplo deste tópico usa o ID de região
cn-hangzhouda região China (Hangzhou). Por padrão, o acesso aos recursos de um bucket ocorre pelo endpoint público. Para acessar recursos no bucket por meio de outros serviços da Alibaba Cloud na mesma região do bucket, use o endpoint interno. Para mais informações sobre as regiões e os endpoints do OSS, consulte Regions and endpoints.Para copiar um objeto, são necessárias permissões de leitura no objeto de origem, além de 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, objetos de um bucket na região China (Hangzhou) não podem ser copiados para um bucket na região China (Qingdao).
Certifique-se de que não haja políticas de retenção configuradas para os buckets de origem e de destino. Caso contrário, o sistema retornará a seguinte mensagem de erro: The object you specified is immutable.
Permissões
Por padrão, uma conta Alibaba Cloud tem 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 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. |
|
|
||
|
|
Se você especificar a versão do objeto de origem por meio do versionId, essa permissão também será necessária. |
|
|
|
Se você copiar as tags do objeto por meio do x-oss-tagging, essas permissões serão necessárias. |
|
|
|
||
|
|
Se você especificar as tags de uma versão específica do objeto de origem por meio do versionId, essa permissão também será necessária. |
|
|
|
Ao copiar um objeto, se os metadados do objeto de destino contiverem X-Oss-Server-Side-Encryption: KMS, essas duas permissões serão necessárias. |
|
|
|
Método
copy_object(request: CopyObjectRequest, **kwargs) → CopyObjectResult
Parâmetros da requisição
|
Parâmetro |
Tipo |
Descrição |
|
request |
CopyObjectRequest |
O parâmetro da requisição. Para mais informações, consulte CopyObjectRequest. |
Parâmetros comuns de CopyObjectRequest
|
Parâmetro |
Tipo |
Descrição |
|
bucket |
str |
O nome do bucket de destino. |
|
key |
str |
O nome do objeto de destino. |
|
source_bucket |
str |
O nome do bucket de origem. |
|
source_key |
str |
O nome do objeto de origem. |
|
forbid_overwrite |
str |
Especifica se a operação CopyObject sobrescreve um objeto existente com o mesmo nome. |
|
tagging |
str |
As tags do objeto de destino. É possível configurar várias tags para o objeto de destino. Exemplo: TagA=A&TagB=B. |
|
tagging_directive |
str |
O método usado para configurar as tags no objeto de destino. Valores válidos:
|
Parâmetros de resposta
|
Tipo |
Descrição |
|
CopyObjectResult |
O valor de retorno. Para mais informações, consulte CopyObjectResult |
Para a definição completa do método de cópia de objetos, consulte copy_object.
Código de exemplo
O código de exemplo a seguir mostra como copiar um objeto com tamanho inferior a 5 GiB de um bucket de origem para um bucket de destino:
import argparse
import alibabacloud_oss_v2 as oss
# Create a command line parameter parser.
parser = argparse.ArgumentParser(description="copy object sample")
# Specify the --region parameter to indicate the region in which the bucket is located. This parameter is required.
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# Specify the --bucket parameter, which specifies the name of the destination bucket. This parameter is required.
parser.add_argument('--bucket', help='The name of the destination bucket.', required=True)
# Specify the --endpoint parameter to indicate the endpoint of the region in which the bucket is located. This parameter is optional.
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# Specify the --key parameter, which specifies the name of the destination object. This parameter is required.
parser.add_argument('--key', help='The name of the destination object.', required=True)
# Specify the --source_key parameter, which specifies the name of the source object. This parameter is required.
parser.add_argument('--source_key', help='The name of the source object.', required=True)
# Specify the --source_bucket parameter, which specifies the name of the source bucket. This parameter is required.
parser.add_argument('--source_bucket', help='The name of the source bucket.', required=True)
def main():
# Parse the command line parameters.
args = parser.parse_args()
# Obtain access credentials from environment variables for authentication.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Load the default configurations of the SDK and specify the credential provider.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Specify the region in which the bucket is located.
cfg.region = args.region
# If the endpoint parameter is provided, specify the endpoint.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Use the configurations to create an OSSClient instance.
client = oss.Client(cfg)
# Copy objects.
result = client.copy_object(oss.CopyObjectRequest(
bucket=args.bucket, # The name of the destination bucket.
key=args.key, # The key name of the destination object.
source_key=args.source_key, # The key name of the source object.
source_bucket=args.source_bucket, # The name of the source bucket.
))
# Output the result information of the copy operation.
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version id: {result.version_id},'
f' hash crc64: {result.hash_crc64},'
f' source version id: {result.source_version_id},'
f' server side encryption: {result.server_side_encryption},'
f' server side data encryption: {result.server_side_data_encryption},'
f' last modified: {result.last_modified},'
f' etag: {result.etag},'
)
# Call the main function when the script is directly run.
if __name__ == "__main__":
main() # Specify the entry points in the main function of the script when the script is directly run.
Referências
Para o código de exemplo completo de cópia de objetos, consulte copy_object.py.