2012-02-03 11 views
6

Aquí hay un código de ejemplo de copia de una clave S3. Hay muchas razones por las que puede querer hacer esto, una de las cuales es actualizar los metadatos clave. Y si bien esta parece ser la solución ampliamente aceptada para eso, hay un gran problema. El problema es cuando hago el ejemplo a continuación, en realidad pierdo mi Content-Type, que vuelve a ser 'application/octet-stream' (no es muy útil si se trata de publicar imágenes web).boto.s3: copy() en un objeto clave pierde metadatos 'Content-Type'

# Get bucket 
conn = S3Connection(self._aws_key, self._aws_secret) 
bucket = conn.get_bucket(self._aws_bucket) 

# Create key 
k = Key(bucket) 
k.key = key 

# Copy old key 
k.metadata.update({ meta_key: meta_value }) 
k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True) 
k = k2 

¿Alguna idea? Gracias.

+1

'copy' sólo se devuelve una copia superficial de un objeto. Intenta usar 'deepcopy'. –

+0

@Joel: boto no proporciona una copia profunda. –

Respuesta

5

La siguiente GitHub Gist trabajó para mí:

import boto 

s3 = boto.connect_s3() 
bucket = s3.lookup('mybucket') 
key = bucket.lookup('mykey') 

# Copy the key onto itself, preserving the ACL but changing the content-type 
key.copy(key.bucket, key.name, preserve_acl=True, metadata={'Content-Type': 'text/plain'}) 

key = bucket.lookup('mykey') 
print key.content_type 

Tomó muuuucho tiempo para correr, aunque!

1

echar un vistazo a this posterior

que tiene que hacer un

key = bucket.get_key(key.name) 

a continuación:

metadata['Content-Type'] = key.content_type will work 

lo contrario, volverá key.content_typeapplication/octet-stream

Cuestiones relacionadas