Как найти MIME-тип файла в Python? - PullRequest
165 голосов
/ 04 сентября 2008

Допустим, вы хотите сохранить группу файлов где-нибудь, например, в BLOB. Допустим, вы хотите выложить эти файлы через веб-страницу и клиент автоматически открывает нужное приложение / средство просмотра.

Предположение: браузер выясняет, какое приложение / средство просмотра использовать заголовком mime-type (content-type?) В ответе HTTP.

Исходя из этого предположения, помимо байтов файла, вы также хотите сохранить тип MIME.

Как бы вы нашли MIME-тип файла? Я в настоящее время на Mac, но это также должно работать на Windows.

Добавляет ли браузер эту информацию при публикации файла на веб-странице?

Есть ли аккуратная библиотека Python для поиска этой информации? Веб-сервис или (что еще лучше) загружаемая база данных?

Ответы [ 17 ]

5 голосов
/ 06 сентября 2016

В Python 3.x и веб-приложении с URL-адресом файла, который не может иметь расширение или поддельное расширение. Вы должны установить python-magic, используя

pip3 install python-magic

Для Mac OS X вы также должны установить libmagic, используя

brew install libmagic

Фрагмент кода

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.readline())
print(mime_type)

в качестве альтернативы вы можете поместить размер в чтение

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.read(128))
print(mime_type)
3 голосов
/ 19 июня 2012

Модуль mimetypes просто распознает тип файла на основе расширения файла. Если вы попытаетесь восстановить тип файла без расширения, mimetypes не будут работать.

0 голосов
/ 22 мая 2019

Сначала я пробую библиотеку mimetypes. Если это не работает, я использую библиотеку python-magic вместо этого.

import mimetypes
def guess_type(filename, buffer=None):
mimetype, encoding = mimetypes.guess_type(filename)
if mimetype is None:
    try:
        import magic
        if buffer:
            mimetype = magic.from_buffer(buffer, mime=True)
        else:
            mimetype = magic.from_file(filename, mime=True)
    except ImportError:
        pass
return mimetype
0 голосов
/ 25 июля 2018

Для данных типа байтового массива вы можете использовать magic.from_buffer (_byte_array, мим = True)

0 голосов
/ 31 октября 2017

Это может быть уже старым, но почему бы не использовать UploadedFile.content_type напрямую из Django? Разве это не то же самое? (https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type)

0 голосов
/ 19 августа 2017

Я пробовал много примеров, но с Django mutagen играет хорошо.

Пример проверки, если файлы mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

try:
    audio = MP3(file)
except HeaderNotFoundError:
    raise ValidationError('This file should be mp3')

Недостатком является то, что ваша способность проверять типы файлов ограничена, но это отличный способ, если вы хотите не только проверить тип файла, но и получить доступ к дополнительной информации.

0 голосов
/ 23 мая 2012

Вы можете использовать imghdr Модуль Python.

...