7

Tôi muốn thao tác một đối tượng python ngâm trong S3 trong hộp cát của Google App Engine. Tôi sử dụng gợi ý trong boto của documentation:Có thể đọc tệp từ S3 trong Google App Engine bằng boto không?

from boto.s3.connection import S3Connection 

from boto.s3.key import Key 

conn = S3Connection(config.key, config.secret_key) 
bucket = conn.get_bucket('bucketname') 
key = bucket.get_key("picture.jpg") 
fp = open ("picture.jpg", "w") 
key.get_file (fp) 

nhưng điều này đòi hỏi tôi phải viết thư cho một tập tin, mà rõ ràng là không kosher trong sandbox GAE.

Làm cách nào để giải quyết vấn đề này? Cảm ơn nhiều sự giúp đỡ nào

Trả lời

7

Bạn không cần phải viết vào một tập tin hoặc một StringIO ở tất cả. Bạn có thể gọi key.get_contents_as_string() để trả lại nội dung của khóa dưới dạng chuỗi. Tài liệu cho khóa là here.

+0

cảm ơn Nick. Điều này làm việc, và không cần phải nhập mô-đun StringIO. Tôi nghĩ vì những lý do rõ ràng làm cho nó trở thành một giải pháp tốt hơn. Đối với bất kỳ ai theo dõi ở nhà, tôi đã thay đổi pickle.load (content) thành pickle.loads (content) để làm việc với việc bỏ chọn một đối tượng giống như chuỗi, chứ không phải là tập tin. – rd108

+0

Tôi cũng khuyên bạn nên sử dụng validate = False để gọi get_bucket - nghĩa là bucket = conn.get_bucket (bucket_name, validate = False) khi boto cố gắng truy cập vào nhóm và sẽ thất bại nếu không có quyền truy cập. để biết thêm thông tin, hãy xem: http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden –

+0

Ngoài ra, các phím boto có một .open() gọi bạn co thể sử dụng. – meawoppl

3

Bạn có thể viết thành một blob và sử dụng StringIO để lấy dữ liệu

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 
from google.appengine.ext import db 

class Data(db.Model) 
    image = db.BlobProperty(default=None) 

conn = S3Connection(config.key, config.secret_key) 
bucket = conn.get_bucket('bucketname') 
key = bucket.get_key("picture.jpg") 
fp = StringIO.StringIO() 
key.get_file(fp) 

data = Data(key_name="picture.jpg") 
data.image = db.Blob(fp.getvalue()) 
data.put() 
+0

cảm ơn, công trình này. Sử dụng StringIO là một ý tưởng tuyệt vời. – rd108

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