Класс TemporaryUploadedFile
Класс TemporaryUploadedFile наследуется от UploadedFile и используется Django для представления файлов, загруженных через формы, когда размер файла превышает настройку FILE_UPLOAD_MAX_MEMORY_SIZE. В отличие от InMemoryUploadedFile, этот класс хранит содержимое файла во временной директории на диске, а не в оперативной памяти. Основные параметры: UploadedFile/attribute/name/">name - имя файла, size - размер в байтах, UploadedFile/attribute/content_type/">content_type - MIME-тип, а также temporary_file_path - путь к временному файлу. Класс предоставляет методы для чтения содержимого по частям и закрытия файла после обработки.
Синтаксис
class TemporaryUploadedFile(name, size, content_type, charset, content_extra_headers)
Параметры конструктора:
name # Имя загруженного файла (строка)
size # Размер файла в байтах (целое число)
content_type # MIME-тип файла (строка)
charset # Кодировка (строка, опционально)
content_extra_headers # Дополнительные заголовки (словарь, опционально)
Пример
Обработка загруженного файла в представлении, когда он автоматически сохраняется как временный:
from django.shortcuts import render
from django.http import HttpResponse
def upload_view(request):
if request.method == 'POST':
uploaded_file = request.FILES['file']
# Проверяем, является ли файл временным
if hasattr(uploaded_file, 'temporary_file_path'):
print("File is stored temporarily on disk")
print(f"Temporary path: {uploaded_file.temporary_file_path()}")
# Читаем содержимое файла по частям
content = b''
for chunk in uploaded_file.chunks():
content += chunk
return HttpResponse(f"File size: {uploaded_file.size} bytes")
return render(request, 'upload.html')
Пример
Принудительное использование временного хранения с помощью настройки в проекте:
# settings.py
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 # 1 MB
FILE_UPLOAD_TEMP_DIR = '/tmp/uploads/' # Кастомная директория
# views.py
from django.core.files.uploadedfile import TemporaryUploadedFile
def handle_large_file(request):
if request.method == 'POST':
file_obj = request.FILES.get('large_file')
if isinstance(file_obj, TemporaryUploadedFile):
# Файл хранится на диске
print(f"Temporary file path: {file_obj.temporary_file_path()}")
print(f"File name: {file_obj.name}")
print(f"Content type: {file_obj.content_type}")
# Сохраняем файл в нужное место
with open('final_file.dat', 'wb') as destination:
for chunk in file_obj.chunks():
destination.write(chunk)
return HttpResponse("File processed successfully")
Результат выполнения кода:
"Temporary file path: /tmp/uploads/tmpfile_abcdef"
"File name: document.pdf"
"Content type: application/pdf"
Пример
Проверка типа загруженного файла и его обработка в зависимости от размера:
from django.core.files.uploadedfile import TemporaryUploadedFile, InMemoryUploadedFile
def process_file(request):
if request.method == 'POST':
file = request.FILES['attachment']
if isinstance(file, TemporaryUploadedFile):
print("Large file: processing using file system")
path = file.temporary_file_path()
with open(path, 'rb') as f:
data = f.read(1024) # Читаем первые 1024 байта
elif isinstance(file, InMemoryUploadedFile):
print("Small file: processing in memory")
data = file.read()
print(f"File size: {file.size} bytes")
print(f"File name: {file.name}")
return HttpResponse("File processed")
Результат выполнения кода:
"Large file: processing using file system"
"File size: 5242880 bytes"
"File name: video.mp4"
Смотрите также
-
класс
UploadedFile,
базовый класс для всех загруженных файлов -
класс
InMemoryUploadedFile,
который хранит файл в памяти -
класс
File,
базовый класс для работы с файлами -
атрибут
content_type,
который возвращает MIME-тип загруженного файла