Автоматическая генерация миниатюр для поля FileField в django
Я загрузил различные типы файлов в свой проект (pdf, doc, mp4, jpg). Теперь я хочу автоматически генерировать миниатюры для каждого файла, который будет добавлен или был добавлен ранее, и сохранять их в моей БД. Вот что я думаю: вот моя модель файла:
class File(models.Model):
slug = models.SlugField(
max_length=255,
unique=True,
)
address = models.FileField(
validators=[
file_size,
FileExtensionValidator(
allowed_extensions=[
"jpg",
"mp4",
"doc",
"pdf",
]
),
],
upload_to="files/",
max_length=255,
)
thumbnail = models.ImageField(
upload_to="files/thum/", max_length=255, null=True, blank=True
)
TYPES = [
(IMG, "Image"),
(VID, "Video"),
(DOC, "Document"),
]
type = models.CharField(max_length=3, choices=TYPES, default=IMG)
здесь я написал функцию :
from io import StringIO
from PIL import Image
def make_thumbnail(file):
if file.type == File.IMG:
make_image_thumbnail(file)
if file.type == File.VID:
make_video_thumbnail(file)
if file.type == File.DOC:
make_document_thumbnail(file)
def make_image_thumbnail(file):
img = Image.open(file.address)
img.thumbnail((128, 128), Image.ANTIALIAS)
thumbnailString = StringIO()
img.save(thumbnailString, "JPEG")#error : string argument expected, got 'bytes'
newFile = InMemoryUploadedFile(
thumbnailString, None, "temp.jpg", "image/jpeg", thumbnailString.len, None
)
return newFile
def make_video_thumbnail(file):
video_input_path = file.address
file_name = file.slug + "thumbnail"
img_output_path = os.path.join(settings.MEDIA_ROOT, file_name)
subprocess.call(
[
"ffmpeg",
"-i",
video_input_path,
"-ss",
"00:00:00.000",
"-vframes",
"1",
img_output_path,
]
)
def make_document_thumbnail(file):
# cache_path = ?
# pdf_or_odt_to_preview_path = file.address
# manager = PreviewManager(cache_path, create_folder=True)
# path_to_preview_image = manager.get_jpeg_preview(pdf_or_odt_to_preview_path)
pass
Теперь я хочу заполнить функции и не знаю a) как я могу автоматически генерировать их b) как я могу генерировать миниатюры для изображений и документов? (Я тестировал эти либы, но я был в полном замешательстве). preview-generator и также django-thumbnails (для файлов, которые я добавил, я планировал написать миграцию и запустить ее. есть ли лучшая идея?)