Правильный способ обработки mime-типов в загрузчике

Я использую библиотеку запросов в python для загрузки файла изображения с помощью http. Я конвертирую полученное содержимое в необработанные байты с помощью BytesIO в python, а затем использую Pillow () для сохранения этого необработанного содержимого в виде файла jpeg.

from PIL import Image
from io import BytesIO

rsp = requests.get(imageurl)
content_type_received = rsp.headers['Content-Type'] # mime type
binarycontent = BytesIO(rsp.content)
if content_type_received.startswith('image'): # image/jpeg, image/png etc
    i = Image.open(binarycontent)
    outfilename = os.path.join(outfolder,'myimg'+'.jpg')
    with open(outfilename, 'wb') as f:
        f.write(rsp.content)
    rsp.close()

В приведенном выше коде я принудительно конвертирую в jpg независимо от типа пантомимы. Мне это интуитивно не кажется приятным. Есть ли стандартный способ обработки подтипов mime image / png, image / gif и т. Д. В Python или библиотеке Pillow?


person hAcKnRoCk    schedule 27.03.2017    source источник


Ответы (1)


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

РЕДАКТИРОВАТЬ: если вы доверяете типу контента (обычно не следует), продолжайте и назовите файл, используя это. если вы не используете магию Python для проверки типа изображения, а затем используете его. Файл, который вы сохраняете, не "конвертируется", он соответствует тому формату, который был отправлен.

person pypypy    schedule 27.03.2017
comment
Я пытаюсь сохранить изображение, полученное через запросы python, которые могут быть png, jpeg и т. Д. Я думаю, что его не следует преобразовывать таким образом в jpeg. - person hAcKnRoCk; 27.03.2017
comment
Этот ответ также может быть полезен stackoverflow.com/ questions / 13137817 / - person pypypy; 27.03.2017
comment
Вам не нужно использовать Pillow, если вы не собираетесь ничего делать с объектом изображения. Просто проверьте первые 1024 байта rsp.raw: real_mime_type = magic.from_buffer(rsp.raw.read(1024), mime=True) и решите, что делать с rsp.content (отбросьте его или сохраните). - person n.abing; 27.03.2017