Класс ContentFile

Класс ContentFile наследуется от File и предоставляет возможность работать с содержимым файла, которое хранится в памяти как строковый или байтовый объект. Этот класс особенно полезен при необходимости создать файл динамически и сохранить его через систему хранения Django, минуя физическую файловую систему. В качестве аргумента конструктор принимает содержимое файла в виде строки или байтов, а также опциональное имя файла.

Синтаксис

pythonfrom django.core.files.base import ContentFile

ContentFile(content, name=None)

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

Пример

Давайте создадим файл из текстовой строки и сохраним его через стандартную систему хранения:

pythonfrom django.core.files.base import ContentFile
from django.core.files.storage import default_storage

content = "Hello, World!"
file = ContentFile(content.encode('utf-8'), name="hello.txt")
saved_path = default_storage.save("files/" + file.name, file)
print(saved_path)

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

python"files/hello.txt"

Пример

Используем ContentFile для сохранения содержимого в поле модели FileField:

pythonfrom django.db import models
from django.core.files.base import ContentFile

class Document(models.Model):
  title = models.CharField(max_length=100)
  file = models.FileField(upload_to='documents/')

doc = Document.objects.get(id=1)
content = "This is the content of the document."
doc.file.save("document.txt", ContentFile(content.encode('utf-8')))
doc.save()

Пример

Создадим изображение в памяти с помощью библиотеки PIL и сохраним его через ContentFile:

pythonfrom io import BytesIO
from PIL import Image
from django.core.files.base import ContentFile

# Создаем изображение в памяти
image = Image.new('RGB', (100, 100), color='red')
image_io = BytesIO()
image.save(image_io, format='PNG')

# Создаем ContentFile из байтов изображения
content_file = ContentFile(image_io.getvalue(), name="red_square.png")

Пример

Прочитаем содержимое существующего файла и создадим его копию с новым именем:

pythonfrom django.core.files.base import ContentFile
from django.core.files.storage import default_storage

# Открываем существующий файл
with default_storage.open("files/original.txt", "rb") as f:
  content = f.read()

# Создаем копию с новым именем
new_file = ContentFile(content, name="copy_of_original.txt")
saved_path = default_storage.save("files/" + new_file.name, new_file)
print(saved_path)

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

python"files/copy_of_original.txt"

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

  • класс File,
    базовый класс для работы с файлами
  • класс Storage,
    абстрактный класс системы хранения файлов
  • класс default_storage,
    объект для работы с хранилищем по умолчанию
  • метод save,
    сохранение файла в хранилище