2012-02-03 8 views
6

Ecco alcuni esempi di codice di copia di una chiave S3. Ci sono molte ragioni per cui potresti voler fare questo, una delle quali è aggiornare i metadati chiave. E mentre questa sembra essere la soluzione ampiamente accettata per questo, c'è un grosso problema. Il problema è quando faccio l'esempio qui sotto, in realtà perdo il mio Content-Type, che di default torna a 'application/octet-stream' (non molto utile se provi a pubblicare immagini web).boto.s3: copy() su un oggetto chiave perde i metadati "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 

Qualche idea? Grazie.

+1

'copy' restituisce solo un copia superficiale di un oggetto. Prova a usare 'deepcopy'. –

+0

@Joel: boto non fornisce deepcopy. –

risposta

5

Il seguente GitHub Gist ha lavorato per me:

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 

preso un tempo luuungo di correre però!

1

un'occhiata a this posta

quello che devi fare un

key = bucket.get_key(key.name) 

poi:

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

altrimenti, key.content_type tornerà application/octet-stream

Problemi correlati