Класс ContentFile
Класс ContentFile наследуется от File и предоставляет
возможность работать с содержимым файла, которое хранится
в памяти как строковый или байтовый объект. Этот класс
особенно полезен при необходимости создать файл динамически
и сохранить его через систему хранения Django, минуя
физическую файловую систему. В качестве аргумента
конструктор принимает содержимое файла в виде строки
или байтов, а также опциональное имя файла.
Синтаксис
from django.core.files.base import ContentFile
ContentFile(content, name=None)
Параметры конструктора:
- ⁅b⁆content⁅/b⁆ - содержимое файла в виде строки или байтов;
-
⁅b⁆name⁅/b⁆ - опциональное имя файла (по умолчанию
None).
Пример
Давайте создадим файл из текстовой строки и сохраним его через стандартную систему хранения:
from 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)
Результат выполнения кода:
"files/hello.txt"
Пример
Используем ContentFile для сохранения содержимого
в поле модели FileField:
from 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:
from 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")
Пример
Прочитаем содержимое существующего файла и создадим его копию с новым именем:
from 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)
Результат выполнения кода:
"files/copy_of_original.txt"
Смотрите также
-
класс
File,
базовый класс для работы с файлами -
класс
Storage,
абстрактный класс системы хранения файлов -
класс
default_storage,
объект для работы с хранилищем по умолчанию -
метод
save,
сохранение файла в хранилище