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()
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
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 –
Ayrıca, boto tuşlarının bir .open() çağrısı vardır. kullanabilirsiniz. – meawoppl