Загрузка файлов в Django (request.FILES)

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 281]


    Продолжаем изучать Django и сегодня мы научимся загружать файлы на сервер. Методы прямой работы с request.FILES редко рассматриваются и мы попробуем восполнить этот пробел.

    Для загрузки небольших файлов (ограниченных лимитом на объем передаваемых данных методом POST) можно использовать стандартный элемент HTML-формы:

    <input type="file" name="upload_files" placeholder="Загрузить файл ..." multiple />

    В общем виде форма предполагающая загрузку файла в виде части Django-шаблона будет выглядеть следующим образом:

    <form method="post" action="/file-manager/" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="upload_files" placeholder="Загрузить файл ..." multiple />
    <input type="submit" value="Загрузить файлы" />
    </form>

    В этом примере стоит обратить внимание на тип кодирования передаваемых формой данных multipart/form-data, этот тип обязательно должен быть установлен если предполагается загрузка файлов на сервер.

    Для обработки загрузки файлов (а используя параметр multiple мы разрешаем именно множественную загрузку файлов) используется примерно такая конструкция:

    # Загрузить файлы
    if 'upload_file' in request.POST:
    for uploaded_file in request.FILES.getlist('upload_files'):
    with default_storage.open('tmp/' + str(uploaded_file), 'wb+') as destination:
    for chunk in uploaded_file.chunks():
    destination.write(chunk)

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

    from django.core.files.storage import default_storage

    Обратите внимание, что при помощи default_storage можно писать только в каталог определенный параметром конфигурации MEDIA.


    Связанные записи в блоге

    Обсуждение статьи
    Вопрос нашего пользователяА какие ограничения на размер загружаемого методом POST файла?
    Ответ на комментарийЯ так понимаю, что он задается переменной MAX_UPLOAD_SIZE = ... без задания этого ограничителя наверное тоже есть какое-то дефолтное значение, но я с этим не сталкивался. Файл в 150 мб вполне себе загрузился, а для более сложных случаев обычно используется Java script с функцией докачки.

    Ваш комментарий: