Загрузка больших файлов с помощью Python / Django - PullRequest
23 голосов
/ 24 ноября 2011

Мне интересно, есть ли какие-либо последствия при загрузке файлов размером примерно 4 ГБ через веб-приложение, использующее Django / Python? Я помню, что в прошлом потоковая загрузка с использованием Java была предпочтительным методом, но делает ли это все еще сегодня или это совершенно безопасно делать с Django / Python?

Ответы [ 3 ]

23 голосов
/ 24 ноября 2011

По умолчанию Django помещает данные загруженного файла в память, если она меньше 2,5 МБ. Все, что больше, будет записано в каталог сервера /tmp, а затем скопировано по завершении передачи. Многие параметры загрузки файлов в Django могут быть настроены, подробности доступны в документации . Вы также можете настроить обработку файлов, и вам наверняка захочется это сделать.

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

Вы также можете столкнуться с проблемами на сервере. Помимо того, что каждый поток будет занят обработкой потоковых данных, у вас есть время, необходимое системе для копирования результирующего файла из /tmp в правильное местоположение.

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

Хотя Django технически способен принимать загруженные файлы такого размера, очень плохой пользовательский опыт и технические трудности означают, что это может быть не лучшим подходом. Рассматривали ли вы использование специального программного обеспечения для передачи файлов?

5 голосов
/ 17 апреля 2014

Последний ответ охватывает это. Мы обычно загружаем 2,5 МБ + (но обычно не 4 ГБ)

adamnish ссылка верна, смотрите этот фрагмент (из его ссылки на django docs ) относительно записи файла на диск, вместо того, чтобы сначала сохранять его в памяти:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

Более подробная информация о вызове "куски": https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

Страница содержит информацию о том, как установить размер фрагмента и т. Д.

1 голос
/ 19 марта 2019

Для будущих читателей: Чтобы увеличить максимально допустимый размер файла при наличии в памяти, установите в вашем settings.py:

FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # make it 5Mb instead of 2Mb

Конечно, это не поможет вам для 4Gb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...