Класс 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 - путь к временному файлу. Класс предоставляет методы для чтения содержимого по частям и закрытия файла после обработки.

Синтаксис

pythonclass TemporaryUploadedFile(name, size, content_type, charset, content_extra_headers)

Параметры конструктора:

pythonname     # Имя загруженного файла (строка)
size     # Размер файла в байтах (целое число)
content_type # MIME-тип файла (строка)
charset    # Кодировка (строка, опционально)
content_extra_headers # Дополнительные заголовки (словарь, опционально)

Пример

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

pythonfrom 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')

Пример

Принудительное использование временного хранения с помощью настройки в проекте:

python# 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")

Результат выполнения кода:

python"Temporary file path: /tmp/uploads/tmpfile_abcdef"
"File name: document.pdf"
"Content type: application/pdf"

Пример

Проверка типа загруженного файла и его обработка в зависимости от размера:

pythonfrom 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")

Результат выполнения кода:

python"Large file: processing using file system"
"File size: 5242880 bytes"
"File name: video.mp4"

Смотрите также

  • класс UploadedFile,
    базовый класс для всех загруженных файлов
  • класс InMemoryUploadedFile,
    который хранит файл в памяти
  • класс File,
    базовый класс для работы с файлами
  • атрибут content_type,
    который возвращает MIME-тип загруженного файла