使用Amazon S3与Heroku、Python和Flask

11

我正在尝试使用Flask在Heroku上创建一个简单的图像上传应用。我正在遵循这里的教程:http://flask.pocoo.org/docs/patterns/fileuploads/

然而,我想使用S3存储文件而不是临时目录,因为Heroku不允许写入磁盘。我找不到针对Heroku和Flask如何实现这一点的任何示例。


1
作为附注,我最近发布了一个 Flask 扩展,叫做 Flask-S3,它允许您轻松地将应用程序的静态资源托管在 S3 上。下一阶段之一将是将上传到 S3 集成到扩展中,请保持关注 :-) - Edwardr
5个回答

12

在存储上传文件到临时文件的示例代码中,我认为你只需要将file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))替换为将文件上传到S3的代码即可。

例如,从链接页面:

def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            s3 = boto.connect_s3()
            bucket = s3.create_bucket('my_bucket')
            key = bucket.new_key(filename)
            key.set_contents_from_file(file, headers=None, replace=True, cb=None, num_cb=10, policy=None, md5=None) 
            return 'successful upload'
    return ..

或者,如果你想异步上传到S3,你可以使用Heroku提供的任何队列机制。


最好有直接上传文件到Amazon S3而无需将文件保存到磁盘的指导。 - Shashank
@shihon 我的理解是这个文件是在内存中操作的,我错了吗? - Michele Gargiulo
嗨,我还想在文件上传到S3后存储URL,有人能建议我如何检索刚上传的文件的URL吗? - KudzieChase

8

这个问题有点旧了,但我认为自从亚马逊引入 CORS支持到S3之后,最好的方法是直接从用户的浏览器上传至S3——而不会经过您的服务器

这个是一个非常简单的flask项目,展示了如何做到这一点。


3
使用 boto 库,操作大致如下:

import boto
from boto.s3.connection import S3Connection
from boto.s3.key import Key


def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            conn = S3Connection('credentials', '')
            bucket = conn.create_bucket('bucketname')
            k = Key(bucket)
            k.key = 'foobar'
            k.set_contents_from_string(file.readlines())
            return "Success!"

当我尝试使用set_contents_from_string(file.readlines())时,出现了错误.....http://pastebin.com/pfZEAPkm - Shashank
你似乎没有对文件名做任何操作,那么为什么要使用secure_filename()呢?因为它不会改变文件名。 - AppHandwerker

2

除了直接将文件存储在磁盘上,您还可以将其数据存储在数据库中(例如进行base64编码)。

无论如何,要使用Python与Amazon S3交互,您应该考虑使用boto库(对于任何其他Amazon服务也是如此)。 要了解如何使用它,您可以查看相关的文档


0

我正在为我现在开发的网站做类似的事情。用户将上传非常大的文件。我正在考虑使用Plupload根据这里的建议直接上传到S3。

另一种选择是使用Boto中的直接上传到S3的上传器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接