Чтение данных файла без сохранения его в колбе


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

вот простая функция загрузки я использую:

@app.route('/upload/', methods=['GET', 'POST'])
def upload():
   if request.method == 'POST':
      file = request.files['file']
      if file:
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        a = 'file uploaded'

return render_template('upload.html', data = a)

прямо сейчас я сохраняю файл, но мне нужно, чтобы переменная 'a' содержала содержимое/данные файла .. любой идеи?

2 59

2 ответа:

FileStorage содержит file.stream.read(). Также вы можете использовать с dst параметр as StringIO или другой объект ввода-вывода или файла для копирования FileStorage.stream к другому объекту ввода-вывода или файлу.

см. документацию: http://flask.pocoo.org/docs/api/#flask.Request.files и http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage.

Если вы хотите использовать стандартный материал колбы - нет никакого способа избежать сохранения временного файла, если размер загруженного файла > 500 Кб. Если он меньше 500kb-он будет использовать "BytesIO", который хранит содержимое файла в памяти, а если он больше 500kb-он хранит содержимое в TemporaryFile () (как указано в документация werkzeug). В обоих случаях ваш скрипт будет блокироваться до тех пор, пока не будет получен весь загруженный файл.

самый простой способ обойти это то, что я нашел:

1) Создайте свой собственный файловый класс ввода-вывода, где вы делаете всю обработку входящих данных

2) в вашем скрипте переопределите класс запроса своим собственным:

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )

3) Замените request_class колбы на свой собственный:

app.request_class = MyRequest

4) иди выпей пива:)