2012-02-03 4 views
6

Oto przykładowy kod kopiowania klucza S3. Istnieje wiele powodów, dla których możesz chcieć to zrobić, jednym z nich jest aktualizacja kluczowych metadanych. I choć wydaje się, że jest to powszechnie akceptowane rozwiązanie, istnieje poważny problem. Problem polega na tym, że kiedy robię przykład poniżej, faktycznie tracę mój Content-Type, który domyślnie powraca do "application/octet-stream" (niezbyt użyteczne, jeśli próbuje się wyświetlać obrazy sieciowe).boto.s3: copy() na kluczowym obiekcie traci metadane "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 

Wszelkie pomysły? Dzięki.

+1

'copy' zwraca tylko płytka kopia obiektu. Spróbuj użyć 'deepcopy'. –

+0

@Joel: boto nie zapewnia głębi. –

Odpowiedz

5

Poniższy GitHub Gist pracował dla mnie:

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 

Took looong czasu, aby uruchomić chociaż!

1

przyjrzeć this postu

trzeba zrobić

key = bucket.get_key(key.name) 

następnie:

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

inaczej, key.content_type powróci application/octet-stream