Класс UploadedFile

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

Синтаксис

python# Получение объекта UploadedFile из request.FILES
uploaded_file = request.FILES['field_name']

# Пример использования в представлении
def handle_uploaded_file(request):
  if request.method == 'POST':
    file = request.FILES['document']
    # Работа с файлом

Основные атрибуты

Класс UploadedFile предоставляет следующие основные атрибуты для доступа к метаданным файла:

pythonfile = request.FILES['document']

# Имя файла
file_name = file.name

# Размер файла в байтах
file_size = file.size

# MIME-тип файла
content_type = file.content_type

# Кодировка файла (если передана)
charset = file.charset

Метод read

Метод read используется для чтения содержимого файла. Он возвращает байтовую строку с данными файла:

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

pythonfrom 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 для обработки файла:

pythonfrom 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 в форме:

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

Результат выполнения при успешной загрузке:

python"File 'document.pdf' uploaded successfully"

Пример . Обработка нескольких файлов

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

pythonfrom 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-тип загруженного файла