2012-02-03 18 views
6

Đây là một số mã mẫu sao chép khóa S3. Có rất nhiều lý do bạn có thể muốn thực hiện việc này, một trong số đó là cập nhật siêu dữ liệu chính. Và trong khi điều này dường như là giải pháp được chấp nhận rộng rãi cho điều đó, thì có một vấn đề lớn. Vấn đề là khi tôi làm ví dụ dưới đây, tôi thực sự mất Content-Type của tôi, mặc định trở lại 'application/octet-stream' (không phải rất hữu ích nếu cố gắng để phục vụ hình ảnh trên web).boto.s3: copy() trên một đối tượng khóa mất metadata '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 

Bất kỳ ý tưởng nào? Cảm ơn.

+1

'copy' chỉ trả về một bản sao nông của một đối tượng. Thử dùng 'deepcopy'. –

+0

@ Jelel: boto không cung cấp bản in sâu. –

Trả lời

5

Sau đây GitHub Gist làm việc cho tôi:

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 

Đã một thời gian looong để chạy mặc dù!

1

hãy nhìn vào this bài

bạn cần làm một

key = bucket.get_key(key.name) 

thì:

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

khác, key.content_type sẽ trở lại application/octet-stream

Các vấn đề liên quan