2016-05-20 3 views
0

Я знаю, что это немного открыто, но я смущен относительно того, какую стратегию/метод следует применять для большого сервиса загрузки файлов, разработанного с использованием Колба и boto3. Для небольших файлов и все в порядке. Но это было бы очень приятно видеть, что вы думаете, ребята, когда размер превышает 100 МБПредпочитаемый способ использования Flask и S3 для больших файлов

То, что я имею в виде Подписчиков -

а) Стрят файл Колбы приложения с помощью какого-то AJAX uploader (То, что я пытаюсь создать, - это просто интерфейс REST с использованием Flask-Restful. Любой пример использования этих компонентов, например Flask-Restful, boto3 и потоковые большие файлы, приветствуется.). Приложение для загрузки будет (я считаю) частью платформы микросервисов, которую мы строим. Я не знаю, будет ли прокси-сервер Nginx перед флеш-приложением или он будет напрямую обслуживаться с помощью модуля/сервиса Kubernetes. В случае, если это напрямую подано, есть ли что-то, что я должен изменить для загрузки большого файла либо в кубернете, либо в слое фляги?

b) Используя прямой загрузчик JS (например, http://www.plupload.com/) и передайте файл в ведро s3 непосредственно и по окончании получите URL-адрес и передайте его в приложение Flask API и сохраните его в БД. Проблема заключается в том, что учетные данные должны быть где-то в JS, что означает угрозу безопасности. (Не уверен, что если какие-либо другие проблемы есть)

Что среди них (или что-то другое, я не думал о вообще), вы думаете, это лучший способ, и где я могу найти некоторые примеры кода для этого?

Заранее спасибо.

[EDIT]

Я нашел это - http://blog.pelicandd.com/article/80/streaming-input-and-output-in-flask, где автор имеет дело с видом подобной ситуации, как и я, и он предложил решение. Но он открывает файл, уже присутствующий на диске. Что делать, если я хочу напрямую загрузить файл, когда он входит в качестве одного объекта в ведро s3? Я чувствую, что это может быть основой решения, но не самого решения.

ответ

0

Используя ссылку, которую я разместил выше, я, наконец, закончил делать следующее. Скажите, пожалуйста, если вы думаете, что это хорошее решение

import boto3 
from flask import Flask, request 

. 
. 
. 

@app.route('/upload', methods=['POST']) 
def upload(): 
    s3 = boto3.resource('s3', aws_access_key_id="key", aws_secret_access_key='secret', region_name='us-east-1') 
    s3.Object('bucket-name','filename').put(Body=request.stream.read(CHUNK_SIZE)) 
. 
. 
. 
1
  1. Колба может использовать память только для сохранения всего тела запроса HTTP, поэтому нет такой функции, как дисковое полирование, как я знаю.
  2. Модуль загрузки Nginx - действительно хороший способ сделать большую загрузку файлов. документ here.
  3. Вы также можете использовать html5, flash, чтобы отправлять транковые файлы и обрабатывать данные в Flask, но это сложно.
  4. Попробуйте найти, если s3 предлагает одноразовый токен.
+0

Что вы думаете о решении я предложил приведенную ниже? – SRC

3

В качестве альтернативы вы можете использовать Minio-py клиентскую библиотеку, его Open Source и совместим с S3 API. Он обрабатывает многостраничную загрузку для вас изначально.

Простой put_object.ру пример:

 
import os 

from minio import Minio 
from minio.error import ResponseError 

client = Minio('s3.amazonaws.com', 
       access_key='YOUR-ACCESSKEYID', 
       secret_key='YOUR-SECRETACCESSKEY') 

# Put a file with default content-type. 
try: 
    file_stat = os.stat('my-testfile') 
    file_data = open('my-testfile', 'rb') 
    client.put_object('my-bucketname', 'my-objectname', file_data, file_stat.st_size) 
except ResponseError as err: 
    print(err) 

# Put a file with 'application/csv' 
try: 
    file_stat = os.stat('my-testfile.csv') 
    file_data = open('my-testfile.csv', 'rb') 
    client.put_object('my-bucketname', 'my-objectname', file_data, 
         file_stat.st_size, content_type='application/csv') 
except ResponseError as err: 
    print(err) 

Вы можете найти список полных операций API с примерами here

Установкой библиотеки Minio-Py

 
$ pip install minio 

Надеется, что это помогает.

Отказ от ответственности: Я работаю Minio

+0

Minio выглядит многообещающим. Спасибо за указатель. Полюбите тот факт, что это написано в Го. Мне нравится идти. – SRC

+0

Спасибо. Вы можете присоединиться к нашему сообществу и помочь нам. :) – koolhead17

Смежные вопросы