Класс UploadedFile
Класс UploadedFile используется в Django для представления файлов, загруженных через формы. Он расширяет базовый класс File и добавляет специфическую для загруженных файлов функциональность. Объекты этого класса автоматически создаются Django при обработке загруженных файлов в запросе и передаются в представления через request.FILES. Класс предоставляет доступ к содержимому файла, его имени, размеру и MIME-типу, а также методы для чтения и обработки данных.
Синтаксис
# Получение объекта UploadedFile из request.FILES
uploaded_file = request.FILES['field_name']
# Пример использования в представлении
def handle_uploaded_file(request):
if request.method == 'POST':
file = request.FILES['document']
# Работа с файлом
Основные атрибуты
Класс UploadedFile предоставляет следующие основные атрибуты для доступа к метаданным файла:
file = request.FILES['document']
# Имя файла
file_name = file.name
# Размер файла в байтах
file_size = file.size
# MIME-тип файла
content_type = file.content_type
# Кодировка файла (если передана)
charset = file.charset
Метод read
Метод read используется для чтения содержимого файла. Он возвращает байтовую строку с данными файла:
from django.shortcuts import render
from django.http import HttpResponse
def upload_view(request):
if request.method == 'POST' and request.FILES.get('document'):
file = request.FILES['document']
# Чтение всего файла
content = file.read()
# Чтение первых 100 байт
first_bytes = file.read(100)
return HttpResponse(f"File size: {len(content)} bytes")
return render(request, 'upload.html')
Метод chunks
Метод chunks является генератором, который возвращает содержимое файла по частям. Это особенно полезно при работе с большими файлами, так как позволяет обрабатывать данные порциями без загрузки всего файла в память:
from django.core.files.storage import default_storage
def save_large_file(request):
if request.method == 'POST' and request.FILES.get('large_file'):
uploaded_file = request.FILES['large_file']
# Сохранение файла по частям
path = default_storage.save(uploaded_file.name, uploaded_file)
# Обработка содержимого по частям
for chunk in uploaded_file.chunks():
# Обработка каждой части файла
process_chunk(chunk)
return HttpResponse("File processed successfully")
Метод multiple_chunks
Метод multiple_chunks возвращает True, если файл должен быть разделен на части при загрузке. Это полезно для проверки, нужно ли использовать метод chunks для обработки файла:
from django.shortcuts import render
from django.http import HttpResponse
def check_file_size(request):
if request.method == 'POST' and request.FILES.get('file'):
uploaded_file = request.FILES['file']
if uploaded_file.multiple_chunks():
# Файл большой, используем chunks
for chunk in uploaded_file.chunks():
process_chunk(chunk)
return HttpResponse("Large file processed in chunks")
else:
# Файл маленький, читаем целиком
content = uploaded_file.read()
return HttpResponse(f"Small file processed: {len(content)} bytes")
return render(request, 'upload.html')
Пример . Использование в форме
Полный пример обработки загруженного файла с использованием класса UploadedFile в форме:
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
def upload_file(request):
if request.method == 'POST' and request.FILES.get('file_field'):
file = request.FILES['file_field']
# Проверка размера файла
if file.size > 5 * 1024 * 1024: # 5 MB
return HttpResponse("File too large")
# Получение имени и типа файла
file_name = file.name
content_type = file.content_type
# Сохранение файла
saved_path = default_storage.save(
f'uploads/{file_name}',
ContentFile(file.read())
)
return HttpResponse(f"File '{file_name}' uploaded successfully")
return render(request, 'upload_form.html')
Результат выполнения при успешной загрузке:
"File 'document.pdf' uploaded successfully"
Пример . Обработка нескольких файлов
Класс UploadedFile позволяет обрабатывать несколько файлов, загруженных одновременно:
from django.shortcuts import render
from django.http import HttpResponse
def upload_multiple(request):
if request.method == 'POST':
files = request.FILES.getlist('documents')
file_info = []
for uploaded_file in files:
info = {
'name': uploaded_file.name,
'size': uploaded_file.size,
'type': uploaded_file.content_type,
}
# Обработка каждого файла
if uploaded_file.multiple_chunks():
# Используем chunks для больших файлов
chunk_count = 0
for chunk in uploaded_file.chunks():
chunk_count += 1
info['chunks'] = chunk_count
else:
content = uploaded_file.read()
info['content_length'] = len(content)
file_info.append(info)
return render(request, 'file_list.html', {'files': file_info})
return render(request, 'upload_multiple.html')
Смотрите также
-
класс
File,
базовый класс для работы с файлами в Django -
атрибут
name,
имя загруженного файла -
атрибут
size,
размер загруженного файла -
атрибут
content_type,
MIME-тип загруженного файла