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

Загрузка больших файлов с помощью Python/Django

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Последний ответ охватывает его. Мы регулярно загружаем 2.5mb + (но обычно не 4gb)

ссылка 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

Страница включает в себя, как установить размер "chunk" и т.д.