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