Автоматическая генерация миниатюр для поля 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 (для файлов, которые я добавил, я планировал написать миграцию и запустить ее. есть ли лучшая идея?)

Вернуться на верх