7

我想在Google App Engine的沙箱中操作S3中存儲的pickle python對象。我用的是建議在博託的documentation是否可以使用boto從Google App Engine中的S3讀取文件?

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) 

但是這需要我寫一個文件,這顯然不是在GAE沙箱潔淨。

我該如何解決這個問題? 感謝任何幫助

回答

7

。您可以撥打key.get_contents_as_string()將密鑰的內容作爲字符串返回。關鍵文件是here

+0

謝謝尼克。這可以工作,而無需導入StringIO模塊。我認爲這是一個更好的解決方案,顯而易見的原因。對於任何一個在家中的人,我將pickle.load(內容)改爲pickle.loads(內容),以取消類似字符串的對象而不是類似文件的對象。 – rd108 2010-10-19 00:45:49

+0

我也建議在get_bucket調用中使用validate = False - 即當boto嘗試訪問存儲桶時,即bucket = conn.get_bucket(bucket_name,validate = False),如果它無法訪問存儲桶,將會失敗。欲瞭解更多信息,請參閱:http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden – 2013-08-09 05:20:02

+0

另外,boto鍵有一個.open()調用,你可以使用。 – meawoppl 2015-03-10 18:54:47

3

您可以編寫成團塊,並使用StringIO從中獲取你並不需要寫一個文件或StringIO的所有數據

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

謝謝,這個工程。使用StringIO是一個好主意。 – rd108 2010-10-16 22:23:34

相關問題