7

Je souhaite manipuler un objet python mariné stocké dans S3 dans le sandbox de Google App Engine. J'utilise la suggestion documentation de Boto:Est-il possible de lire un fichier de S3 dans Google App Engine en utilisant 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) 

mais cela me oblige à écrire dans un fichier, qui est apparemment pas casher dans le bac à sable GAE.

Comment puis-je contourner le problème? Merci beaucoup pour toute aide

Répondre

7

Vous n'avez pas besoin d'écrire dans un fichier ou un StringIO du tout. Vous pouvez appeler key.get_contents_as_string() pour renvoyer le contenu de la clé sous forme de chaîne. Les documents pour la clé sont here.

+0

merci Nick. Cela fonctionne, et sans avoir à importer le module StringIO. Je pense que pour des raisons évidentes cela en fait une meilleure solution. Pour ceux qui suivent à la maison, j'ai changé le pickle.load (contenu) à pickle.loads (contenu) pour travailler avec unpickling un objet semblable à une chaîne, plutôt que semblable à un fichier. – rd108

+0

Je suggère également d'utiliser validate = False pour l'appel get_bucket - c'est-à-dire bucket = conn.get_bucket (bucket_name, validate = False) car boto tente d'accéder au compartiment, et échouera s'il n'y a pas accès. Pour plus d'informations, voir: http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden –

+0

En outre, les clés boto ont un appel .open() que vous peut utiliser. – meawoppl

3

Vous pouvez écrire dans un blob et utiliser le StringIO pour récupérer les données

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

merci, cela fonctionne. Utiliser StringIO était une excellente idée. – rd108