from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render_to_response('upload.html', {'form': form})
Последняя часть головоломки – обработка данных файлов из request.FILES. Каждый элемент словаря является объектом UploadedFile – простая обертка над загруженным файлом, которая содержит методы для доступа к загруженным данным:
Читает все загруженные данные из файла. Будьте осторожны с этим методом: если загруженный файл большой, загрузка его в память может сильно нагрузить вашу систему. Лучше использовать метод chunks(), описанные ниже.
Возвращает True, если загруженный файл достаточно большой, чтобы читать его по частям. По-умолчанию это файл больше 2.5 мегабайт, но это можно настроить(смотрите ниже).
Генератор, который возвращает часть(chunk) файла. Если multiple_chunks() равен True, вы должны использовать этот метод в цикле вместо метода read().
На практике, чаще всего проще всегда использовать метод chunks(), смотрите пример ниже.
Название загруженного файла (например, my_file.txt).
Размер, в байтах, загруженного файла.
def handle_uploaded_file(f):
destination = open('some/file/name.txt', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
Максимальный размер файла, в байтах, который будет загружен в память. Файлы больше чем FILE_UPLOAD_MAX_MEMORY_SIZE будут загружены на диск.
Значение по-умолчанию 2.5 мегабайта.
Каталог, в который сохраняются загруженные файлы больше чем FILE_UPLOAD_MAX_MEMORY_SIZE.
По-умолчанию - системная папка для временных файлов (например, /tmp на большинстве Unix-систем).
Числовое представление прав на файл (например, 0644), которые устанавливаются для загруженных файлов. Подробности можно прочитать в описании функции os.chmod().
Если не указана или равно None, будет зависеть от системы, которую вы используете. В большинстве систем, временные файлы сохраняются с правами 0600. Файлы сохраненные с памяти используют системное значение umask.
Предупреждение
Если вы не знакомы с правами доступа, запомните что 0 очень важен: это указывает на восьмеричное число, которые используются для определения прав. Если вы укажите 644, все будет работать неправильно.
Всегда добавляйте 0 в начале.
Обработчик загрузки файлов. Переопределение этой настройки позволит вам полностью изменить процесс загрузки файлов в Django. Смотрите описание upload handlers ниже.
По умолчанию:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
Что означает “попробуем сначала загрузить в память, а потом во временной файл.”
“Content-Type” заголовок, переданный с загруженным файлом (например, text/plain или application/pdf). Как и всем данным предоставленным пользователям, вы не должны доверять этому значению. Вам по-прежнему необходимо проверять, что содержимое файла отвечает указанному “Content-Type” – “доверяй, но проверяй”.
Для файлов с MIME-типом text/*, кодировка (например, utf8) указанная браузером. Опять же, “доверяй, но проверяй”.
Только файлы загруженные на диск будут содержать этот метод. Возвращает полный путь к временному файлу.
Примечание
Как и с обычным Python файлом, вы можете прочитать его содержимое строкой за строкой в цикле:
for line in uploadedfile:
do_something_with(line)
Однако, в отличии от стандартного Python файла, UploadedFile понимает только \n (так же известный как “Unix-стиль”) перенос строки. Если вам необходимо обработать файл с разными стилями переноса строки, вы должны сделать это самостоятельно.
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
request.upload_handlers.insert(0, ProgressBarUploadHandler())
request.upload_handlers = [ProgressBarUploadHandler()]
Примечание
Вы можете изменить обработчики загрузок перед использованием request.POST или request.FILES – не имеет смысла это делать после начала загрузки. Если вы попытаетесь изменить request.upload_handlers после использования request.POST или request.FILES Django вызовет исключение.
По этому вы должны изменять обработчики загрузки в представлении как можно раньше.
Так же, request.POST используется CsrfViewMiddleware, который включен по умолчанию. Это означает, что вы должны использовать csrf_exempt() для представления, в котором собираетесь изменить обработчики загрузки. Так же не забывайте воспользоваться декоратором csrf_protect() для функции, которая будет обрабатывать запрос. Обратите внимание, что получение файла может начаться перед выполнением CSRF проверки. Например:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def upload_file_view(request):
request.upload_handlers.insert(0, ProgressBarUploadHandler())
return _upload_file_view(request)
@csrf_protect
def _upload_file_view(request):
... # Process request
Получение “части” данных загружаемого файла.
raw_data – байтовая строка с загружаемыми данными.
start – указывает на расположения данных из raw_data в файле.
Данные возвращаемые этим методом будут переданы в метод receive_data_chunk следующих обработчиков. То есть один обработчиком может быть “фильтром” для других.
Верните None если последующие обработчики не должны обрабатывать эти данные. Это может быть полезным, если данные сохраняются в вашем обработчике и вы не хотите, чтобы последующие сохраняли еще одну копию данных.
При вызове исключения StopUpload или SkipFile, загрузка будет остановлена или файл будет полностью проигнорирован.
Вызывается после окончания загрузки файла.
Обработчик должен вернуть объект UploadedFile, который будет добавлен в request.FILES. Обработчик может вернуть None указав, что объект UploadedFile должен быть получен из последующих обработчиков.
Размер, в байтах, “части” файла, которую Django должен сохранить в памяти и передать в обработчик. То есть, этот атрибут контролирует размер “асти файла, которая передается в FileUploadHandler.receive_data_chunk.
Для максимальной производительности это значение должно быть кратным 4 и не превышать 2 GB (231 байтов). Если несколько обработчик указывают разное значение, Django будет использовать самое маленькое.
Значение по умолчанию 64*210 байтов, или 64 KB.
Вызывает перед началом загрузки, до того, как данные будут переданы в один из обработчиков.
field_name строковое название поля <input>.
file_name название файла в unicode предоставленное браузером.
content_type – MIME-тип предоставленный браузером – например, 'image/jpeg'.
content_length – размер изображения предоставленный браузером. Может быть не предоставлен и значение будет равным None.
charset – кодировка (например, utf8) предоставленная браузером. Как и content_length может быть пустым.
Этот метод может вызвать исключение StopFutureHandlers и остановить последующую обработку файла всем обработчиками.
Позволяет полностью переопределить обработку “сырых” HTTP данных.
input_data – объект с интерфейсом файла с данными.
META – объект из request.META.
content_length – размер данных из input_data. Не читайте больше чем content_length байтов из input_data.
boundary – “MIME boundary” запроса.
encoding – кодировка запроса.
Верните None для продолжения обработки, или кортеж (POST, FILES), который будет добавлен в объект запроса.
Aug 21, 2013