Este tema describe cómo copiar un objeto desde un bucket de origen hacia el mismo bucket o hacia uno de destino distinto dentro de la misma región.
Notas
En este tema se utiliza el endpoint público de la región China (Hangzhou). Para acceder a OSS desde otros servicios de Alibaba Cloud en la misma región, utilice un endpoint interno. Para obtener más información sobre las regiones y los endpoints compatibles, consulte Regions and endpoints.
Las credenciales de acceso de este tema se obtienen de variables de entorno. Para obtener más información, consulte 配置访问凭证.
Aquí se muestra cómo crear una instancia de OSSClient con un endpoint de OSS. Para conocer configuraciones alternativas, como usar un dominio personalizado o autenticarse con credenciales de Security Token Service (STS), consulte Client configuration.
Es obligatorio contar con permisos de lectura sobre el objeto de origen y permisos de lectura y escritura en el bucket de destino.
Los buckets de origen y de destino no deben tener políticas de retención configuradas. De lo contrario, la copia falla y se devuelve el error The object you specified is immutable..
No se admite la copia entre distintas regiones. Por ejemplo, no es posible copiar un objeto de un bucket en China (Hangzhou) a otro en China (Qingdao).
Permisos
De forma predeterminada, una cuenta de Alibaba Cloud tiene todos los permisos. Los usuarios o roles de RAM asociados a una cuenta no cuentan con ningún permiso de manera predeterminada. La cuenta de Alibaba Cloud o su administrador deben otorgar los permisos de operación correspondientes mediante RAM policies o Bucket Policy.
|
API |
Action |
Descripción |
|
CopyObject |
|
Copia objetos dentro de un mismo bucket o entre buckets de la misma región. |
|
|
||
|
|
Si especifica la versión del objeto de origen mediante versionId, también se requiere este permiso. |
|
|
|
Estos permisos son obligatorios si copia las etiquetas del objeto mediante x-oss-tagging. |
|
|
|
||
|
|
También se necesita este permiso cuando especifica las etiquetas de una versión concreta del objeto de origen mediante versionId. |
|
|
|
Ambos permisos son necesarios si, al copiar un objeto, los metadatos del objeto de destino incluyen X-Oss-Server-Side-Encryption: KMS. |
|
|
|
Código de ejemplo
Use bucket.copy_object para copiar un objeto y especifique sus metadatos con el parámetro :meta_directive. Durante la operación de copia, los metadatos del objeto se gestionan de alguna de estas maneras:
Si no especifica el parámetro meta, los metadatos del objeto de destino serán idénticos a los del objeto de origen.
Si especifica el parámetro meta, los metadatos del objeto de origen se sobrescriben con los nuevos valores.
A continuación se muestra el código para copiar un objeto:
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)
Referencias
Para obtener más información sobre la operación de API CopyObject, consulte CopyObject.