7

Voglio manipolare un oggetto python decapitato memorizzato in S3 nella sandbox di Google App Engine. Io uso il suggerimento boto di documentation:È possibile leggere un file da S3 in Google App Engine usando boto?

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) 

ma questo mi obbliga a scrivere in un file, che a quanto pare non è kosher nella sandbox GAE.

Come posso aggirare questo? Grazie molto per qualsiasi aiuto

risposta

7

Non è necessario scrivere su un file o di una StringIO a tutti. È possibile chiamare key.get_contents_as_string() per restituire il contenuto della chiave come una stringa. I documenti per la chiave sono here.

+0

grazie Nick. Funziona, e senza dover importare il modulo StringIO. Penso per ovvi motivi che lo rende una soluzione migliore. Per chi segue a casa, ho cambiato il pickle.load (contenuto) in pickle.loads (contenuto) per lavorare con l'annullamento di un oggetto simile a una stringa piuttosto che di un file. – rd108

+0

Suggerisco anche di usare validate = False alla chiamata get_bucket - cioè bucket = conn.get_bucket (bucket_name, validate = False) come boto tenta di accedere al bucket e fallirà se non ha accesso a farlo. per ulteriori informazioni consultare: http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden –

+0

Inoltre, i tasti boto hanno una chiamata .open() poter usare. – meawoppl

3

È possibile scrivere in un blob e utilizzare lo StringIO per recuperare i dati

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

grazie, questo funziona. Usare StringIO è stata una grande idea. – rd108