7

Google App Engine'in sanal alanındaki S3'te depolanmış bir python nesnesini değiştirmek istiyorum. Ben boto en documentation öneriyi kullanın:Google App Engine'deki S3'ten boto'yu kullanarak bir dosyayı okumak mümkün mü?

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) 

ama bu görünüşte GAE'nin sanal alanda koşer olmayan bir dosyaya yazmamı gerektirir.

Bunu nasıl aşabilirim? Bir bloba yazıp Sen hiç bir dosya veya bir StringIO yazmaya gerek yok veriyi

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() 

cevap

7

almak için StringIO kullanabilirsiniz herhangi bir yardım

+0

teşekkürler Nick. Bu çalışır ve StringIO modülünü içe aktarmaya gerek kalmadan. Bunun daha iyi bir çözüm olmasını sağlayan açık nedenlerle düşünüyorum. Evde takip eden herkes için, pickle.load (içerik) dosyasını, dosya benzeri bir nesneden ziyade bir dizgeyi andıran ile çalışmak üzere pickle.loads (içerik) olarak değiştirdim. – rd108

+0

Ayrıca get_bucket çağrısına validate = False kullanılmasını öneririm - yani bucket = conn.get_bucket (bucket_name, validate = False), boto'ya erişebilmek için boto girişimleri olarak kullanılır ve bunun için erişiminiz yoksa başarısız olur. Daha fazla bilgi için bkz: http://stackoverflow.com/questions/12571217/python-amazon-s3-cannot-get-the-bucket-says-403-forbidden –

+0

Ayrıca, boto tuşlarının bir .open() çağrısı vardır. kullanabilirsiniz. – meawoppl

3

için çok teşekkürler. Anahtarın içeriğini bir dize olarak döndürmek için key.get_contents_as_string() numaralı telefonu arayabilirsiniz. Anahtar için dokümanlar here.

+0

teşekkürler, bu çalışır. StringIO kullanmak harika bir fikirdi. – rd108

İlgili konular