在Google App Engine中使用boto从S3读取文件是否可能?

7 投票
2 回答
8688 浏览
提问于 2025-04-16 05:35

我想在Google App Engine的沙箱环境中处理一个存储在S3里的Python对象,这个对象是经过“腌制”的(也就是用pickle模块保存的)。我参考了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)

但是这需要我写入一个文件,而在GAE的沙箱环境中,这显然是不允许的。

我该怎么解决这个问题呢?非常感谢任何帮助。

2 个回答

3

你可以把数据写入一个叫做“blob”的东西,然后用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()
7

你根本不需要把内容写入文件或者使用StringIO。你可以直接调用 key.get_contents_as_string() 这个方法,它会把这个key的内容以字符串的形式返回给你。关于key的详细说明可以在这里找到。

撰写回答