doc или docx: есть ли безопасный способ идентифицировать тип из «запросов» в python3? - PullRequest
0 голосов
/ 18 ноября 2018

1) Как я могу отличить файлы doc и docx от запросов?

a) Например, если у меня есть

url='https://www.iadb.org/Document.cfm?id=36943997'
r = requests.get(url,timeout=15)
print(r.headers['content-type'])

, я получаю это:

application/vnd.openxmlformats-officedocument.wordprocessingml.document

Этот файл является документом.

b) Если у меня есть

url='https://www.iadb.org/Document.cfm?id=36943972'
r = requests.get(url,timeout=15)
print(r.headers['content-type'])

Я получу это

application/msword

Этот файл является документом.

2) Есть ли другие варианты?

3) Если я сохраню файл docx как документ или наоборот, могут ли возникнуть проблемы с распознаванием (например, для преобразования в pdf?)?Есть ли какая-нибудь лучшая практика для борьбы с этим?

1 Ответ

0 голосов
/ 18 ноября 2018

Заголовки MIME, которые вы получаете, выглядят правильными: Что такое правильный тип MIME для docx, pptx и т. Д.?

Однако отправляющее программное обеспечение может работать только с тем файломего пользователь выбрал - и все еще есть много людей, отправляющих файлы с неправильным расширением.Некоторые программы могут справиться с этим, другие не могут.Чтобы увидеть это в действии, измените имя PNG-изображения на JPEG.Я только что сделал на моем Mac, и Preview все еще в состоянии открыть его.Когда я нажимаю ⌘ + I в Finder, он говорит, что это файл JPEG, но при открытии в режиме предварительного просмотра он правильно идентифицируется как файл «Portable Network Graphics».(Ваша ОС может или не может сделать это.)

Но после загрузки файла вы можете однозначно отличаться между файлом DOC и файлом DOCX, даже если автор неправильно определил его расширение.

Файл DOC начинается с заголовка Microsoft OLE, который имеет довольно сложную структуру.Файл DOCX, с другой стороны, представляет собой составной формат файла, содержащий множество небольших файлов XML, сжатых вместе с использованием стандартного сжатия файлов ZIP.Поэтому этот тип файла всегда будет начинаться с двух символов PK.

Эта проверка совместима с Python 2.7 и 3.x (только для одного требуется decode):

import sys

if len(sys.argv) == 2:
    print ('testing file: '+sys.argv[1])
    with open(sys.argv[1], 'rb') as testMe:
        startBytes = testMe.read(2).decode('latin1')
        print (startBytes)
        if startBytes == 'PK':
            print ('This is a DOCX document')
        else:
            print ('This is a DOC document')

Технически он будет уверенно указывать «Это документ DOC» для всего, что не начинается с PK, и, наоборот, он будет говорить «Это документ DOCX» для любого сжатого файла (или даже простой текстовый файл, который начинается с этих двух символов).Поэтому, если вы продолжите обработку файла на основе этого решения, вы можете обнаружить, что это не документ Microsoft Word.Но, по крайней мере, вы попробуете с правильным декодером.

...