Подтвердить что ты не робот

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

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

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

@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', которая содержит содержимое/данные файла.. любые идеи?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

3) Замените класс запроса Flask своим собственным:

app.request_class = MyRequest

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

Ответ 3

В случае, если мы хотим записать файл в памяти на диск. Этот код можно использовать

  if isinstanceof(obj,SpooledTemporaryFile):
    obj.rollover()

Ответ 4

Я не знаю о колбе, но есть ли что-нибудь, чтобы остановить вас, используя чтение?

Предполагая, что файл хранится где-то, когда он его загружает.

f = open('user_uploaded_file.txt','r') # From wherever they upload it to.

read = f.read()