Загруженные файлы и менеджеры закачки

Загруженные файлы

класс UploadedFile

Во время загрузки файлов фактические данные файла сохраняются в формате request.FILES . Каждый элемент этого словаря - это объект UploadedFile (или подкласс), адаптер для загруженного файла. Обычно для доступа к загруженному контенту используется один из этих методов:

UploadedFile.read()

Читает все данные из загруженного файла. Будьте осторожны с этим методом: если затронутый файл очень большой, он может превысить емкость вашей системы, если вы попытаетесь прочитать его в память. Скорее его рекомендуется использовать chunks() , см. Ниже.

UploadedFile.multiple_chunks( chunk_size = Нет )

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

UploadedFile.chunks( chunk_size = Нет )

Генератор, возвращающий сегменты файла. Если multiple_chunks() стоит True , рекомендуется использовать этот метод с циклом вместо использования read() .

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

Вот несколько полезных атрибутов UploadedFile :

UploadedFile.name

Имя загруженного файла (например mon_fichier.txt ).

UploadedFile.size

Размер загруженного файла в байтах.

UploadedFile.content_type

Заголовок, content-type связанный с загруженным файлом (например, text / plain или application / pdf ). Как и все данные, поступающие от пользователя, мы не можем быть уверены, что файл действительно относится к этому типу. Всегда необходимо проверять, соответствует ли содержимое файла типу содержимого, заявленному в заголовке: «доверяй, но контролируй».

UploadedFile.content_type_extra

Словарь, содержащий дополнительные параметры, передаваемые в заголовок content-type . Обычно они предоставляются такими службами, как Google App Engine, которые перехватывают и обрабатывают загрузки файлов за вас. Следовательно, ваш менеджер может получать не содержимое загруженного файла, а скорее URL-адрес или другой указатель на файл (см.RFC 2388 ).

UploadedFile.charset

Для типов содержимого text / * - кодировка символов (например utf8 ), заданная браузером. Опять же, «доверие, но контроль» - самая мудрая стратегия здесь.

Заметка

Как и в случае с обычными файлами Python, вы можете читать файл построчно, просматривая загруженный файл:

for line in uploadedfile:
    do_something_with(line)

Строки разделяются с помощью универсальные символы новой строки . Следующее считается окончанием строки: соглашение'\n' оконце строки в Unix, соглашениеWindows'\r\n' и старое соглашение Macintosh'\r' .

Среди подклассов UploadedFile мы находим:

класс TemporaryUploadedFile

Файл, загруженный во временное расположение (т. Е. Потоковая передача на диск). Этот класс используется TemporaryFileUploadHandler . Помимо методов UploadedFile , у него есть дополнительный метод:

TemporaryUploadedFile.temporary_file_path()

Возвращает полный путь к временному загруженному файлу.

класс InMemoryUploadedFile

Файл, загруженный в память (т. Е. Потоковая передача в память). Этот класс используется MemoryFileUploadHandler .

Интегрированные менеджеры загрузки

Вместе MemoryFileUploadHandler и TemporaryFileUploadHandler определите поведение загрузки файлов Django по умолчанию, помещая небольшие файлы в память, а большие - на диск. Они внутри django.core.files.uploadhandler .

класс MemoryFileUploadHandler

Диспетчер загрузки файлов для потоковой загрузки в память (используется для небольших файлов).

класс TemporaryFileUploadHandler

Менеджер загрузки, который передает данные во временный файл, используя TemporaryUploadedFile .

Написание пользовательских обработчиков загрузки

класс FileUploadHandler

Все менеджеры загрузки файлов должны наследовать от django.core.files.uploadhandler.FileUploadHandler . Их можно разместить где угодно.

Обязательные методы

Настраиваемые менеджеры загрузки должны определять следующие методы:

FileUploadHandler.receive_data_chunk( raw_data , начало )

Получает «сегмент» данных из загруженного файла.

raw_data это строка байтов, содержащая отправленные данные.

start - позиция в файле, соответствующая началу этого сегмента raw_data .

Возвращаемые вами данные будут переданы обратно receive_data_chunk в следующие методы обработчика загрузки. Таким образом, менеджер может быть «фильтром» для других менеджеров.

Resend None С receive_data_chunk предотвратить оставшиеся Загрузить Обработчик от приема этого сегмента. Это может быть полезно, если вы сами храните полученные данные и не хотите, чтобы последующие менеджеры сохраняли копию данных.

Если вы генерируете исключение StopUpload или SkipFile , загрузка зависает или файл полностью пропускается.

FileUploadHandler.file_complete( размер_файла )

Вызывается, когда загрузка файла завершена.

Обработчик должен вернуть объект, UploadedFile который будет храниться в request.FILES . Обработчики также могут возвращаться, None чтобы указать, что объект UploadedFile должен поступить от одного из следующих обработчиков загрузки.

Необязательные методы

Менеджеры загрузки также могут установить один из следующих дополнительных методов или атрибутов:

FileUploadHandler.chunk_size

Размер в байтах сегментов, которые Django хранит в памяти и передает обработчику. Проще говоря, этот атрибут управляет размером сегментов, в которые отправляются FileUploadHandler.receive_data_chunk .

Для оптимальной производительности размер сегмента должен делиться на 4 2 гига (2 31 байт), но не превышать его . Когда разные размеры сегментов указываются разными обработчиками, Django использует наименьший из них размер сегмента.

По умолчанию 64 * 2 10 байтов или 64 КБ.

FileUploadHandler.new_file( имя_поля , имя_файла , тип_содержимого , длина_содержимого , кодировка , тип_содержимого_экстра )

Функция напоминания, указывающая, что начинается отправка нового файла. Он вызывается до того, как данные будут отправлены в диспетчер загрузки.

field_name это имя (строка) поля файла <input> .

file_name - это имя файла, указанное браузером.

content_type - это, например, тип MIME, указанный браузером 'image/jpeg' .

content_length - размер изображения, указанный браузером. Иногда это значение не указывается и содержит None .

charset набор символов (например utf8 ), указанный браузером. Мол content_length , иногда это значение не указывается.

content_type_extra содержит дополнительную информацию о файле согласно заголовку content-type . Смотрите UploadedFile.content_type_extra .

Этот метод может генерировать исключение, StopFutureHandlers чтобы другие менеджеры не могли обрабатывать этот файл после этого.

FileUploadHandler.upload_complete()

Функция напоминания, указывающая, что вся загрузка завершена (все файлы).

FileUploadHandler.handle_raw_input( входные_данные , МЕТА , длина_содержимого , граница , кодировка )

Позволяет обработчику полностью отменять синтаксический анализ необработанного ввода HTTP.

input_data - объект типа файла, который поддерживает read ( read() ).

META тот же объект, что и request.META .

content_length это размер данных в input_data . Не читать больше content_length байтов из input_data .

boundary это граница MIME этого запроса.

encoding кодировка этого запроса.

Верните, None если вы хотите, чтобы обработка загрузки продолжалась, или кортеж, если вы хотите вернуть новые готовые структуры данных непосредственно из запроса.(POST, FILES)

Copyright ©2020 All rights reserved