Flask: получить размер объекта request.files

Я хочу получить размер загрузки изображения для управления, если он больше максимального предела загрузки файла. Я попробовал это:

@app.route("/new/photo",methods=["POST"])
def newPhoto():

    form_photo = request.files['post-photo']
    print form_photo.content_length

Отпечатано 0 Где я делаю неправильно? Должен ли я найти размер этого изображения со временного пути? Разве нет ничего подобного PHP $_FILES['foo']['size'] в Python?

Ответ 1

Здесь нужно знать несколько вещей - свойство content_length будет длиной содержимого загрузки файла, как сообщается браузером, но, к сожалению, многие браузеры не отправляют это, как указано в docs и источник.

Что касается вашего TypeError, то следующая вещь, о которой нужно знать, заключается в том, что загрузка файлов под 500 КБ хранится в памяти как объект StringIO, а не буферизован на диск ( см. эти документы снова), поэтому ваш вызов stat не будет выполнен.

MAX_CONTENT_LENGTH - это правильный способ отклонить загрузку файлов больше, чем вы хотите, и если вам это нужно, единственный надежный способ определить длину данных - это выяснить это после того, как вы обработали загрузку - либо установите после .save() d:

request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size

Или, если вы не используете диск (например, сохраняете его в базе данных), подсчитайте прочитанные байты:

blob = request.files['file'].read()
size = len(blob)

Хотя очевидно, что вы не читаете слишком много данных в памяти, если ваш MAX_CONTENT_LENGTH очень большой

Ответ 2

Если вы не хотите сначала сохранить файл на диск, используйте следующий код, эта работа по потоку в памяти

import os

file = request.files['file']
file.seek(0, os.SEEK_END)
file_length = file.tell()

в противном случае это будет лучше

request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size

Ответ 3

Правильный способ установить максимальный уровень загрузки файлов - через конфигурацию приложения MAX_CONTENT_LENGTH. Например, если вы хотите установить ограничение на загрузку 16 мегабайт, в конфигурацию своего приложения вы должны сделать следующее:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

Если загруженный файл слишком велик, Flask автоматически возвращает код состояния 413 Request Entity Too Large - это должно обрабатываться на стороне клиента.

Ответ 4

Следующий раздел кода должен соответствовать вашей цели.

form_photo.seek(0,2)
size = form_photo.tell()

Ответ 5

Как уже сказал кто-то другой, вы должны использовать

app.config['MAX_CONTENT_LENGTH'] 

чтобы ограничить размер файлов. Но Поскольку вы специально хотите узнать размер изображения, вы можете сделать:

import os
photo_size = os.stat(request.files['post-photo']).st_size
print photo_size