Получить MIME-файл на pre_save в django admin - PullRequest
0 голосов
/ 09 апреля 2020

Я хотел бы сохранить тип файла MIME, получив его по сигналу pre_save.

from django.db.models.signals import pre_save
from django.db import models
import magic

class Media (models.Media):
    file = models.FileField()
    content_type = models.CharField(max_length=128, editable=False)

def media_pre_save(sender, instance, *args, **kwargs):
    if not instance.content_type:
        mime = magic.Magic(mime=True)
        instance.content_type = mime.from_buffer(instance.file.read())
pre_save.connect(media_pre_save, sender=Media)

Но я получаю application/x-empty при просмотре в дБ. Что я делаю не так?

1 Ответ

1 голос
/ 11 апреля 2020

Я наконец-то понял, как получить абсолютный путь к загруженному файлу и используя from_file метод magic, например, так:

instance.content_type = magic.from_file(instance.file.path, mime=True)

Обновленный ответ:

Иногда я получаю пустой файл, если файл немного велик, поэтому мне нужно «искать» в начале загруженного файла и использовать from_buffer метод magic примерно так:

instance.file.seek(0)
instance.content_type = magic.from_buffer(instance.file.read(), mime=True)

Я обязан ответить следующие ссылки: Редактирование загруженного файла (djangos FileField) с использованием сигнала pre_save и https://github.com/ahupp/python-magic

...