Использование Amazon S3 с Heroku, Python и Flask - PullRequest
10 голосов
/ 13 ноября 2011

Я пытаюсь получить простое приложение для загрузки изображений, работающее на Heroku с помощью Flask. Я следую учебному пособию здесь: http://flask.pocoo.org/docs/patterns/fileuploads/

Однако я хочу использовать S3 для хранения файла вместо временного каталога, поскольку Heroku не позволяет записывать на диск. Я не могу найти примеры того, как сделать это специально для Heroku и Flask.

Ответы [ 5 ]

12 голосов
/ 15 декабря 2011

Мне кажется, что в примере кода, который сохраняет загруженный файл во временный файл, вы просто замените 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.

8 голосов
/ 19 марта 2013

Немного старый вопрос, но я думаю, что с тех пор, как Amazon представил поддержку CORS для S3, лучший способ - загрузить напрямую в S3 из браузера пользователя - , не затрагивая биты.ваш сервер .

Этот - очень простой проект с флягами, который точно показывает, как это сделать.

3 голосов
/ 25 сентября 2012

При использовании библиотеки 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!"
2 голосов
/ 30 ноября 2011

Вместо непосредственного сохранения файла на диске вы также можете сохранить его данные в базе данных (например, в кодировке base64).

В любом случае, чтобы взаимодействовать с Amazon S3 с помощью Python, вам следует рассмотреть возможность использования библиотеки boto (то же самое верно для любой другой службы Amazon). Чтобы узнать, как его использовать, вы можете ознакомиться с соответствующей документацией .

0 голосов
/ 01 декабря 2011

Я работаю над чем-то похожим для веб-сайта, который сейчас разрабатываю.Пользователи будут загружать очень большие файлы.Я рассматриваю использование Plupload для прямой загрузки на S3, следуя совету здесь .

Альтернативой является использование загрузчика direct-to-S3 в Boto.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...