Тип файла DOCX в файле PHP finfo - приложение/zip
Здравствуйте, я пытаюсь проверить тип загруженного файла с помощью функции finfo_file.
Но когда отправляется файл .docx, тип файла:
application/zip
Вместо:
application/vnd.openxmlformats-officedocument.wordprocessingml.document
Как я могу изменить это поведение?
4 answers
Насколько я знаю, типы файлов, специфичные для поставщика (vnd.), не стандартизированы (никакими RFC) и, следовательно, не охватываются file_info(). .docx
- это сжатый xml-формат , и это причина, по которой file_info()
возвращает application_zip
(что совершенно правильно). Вы можете распаковать файл и проверить тип mime результата, но это приведет к xml
(что тоже совершенно правильно) и другим файлам, которые используются документом. Чтобы различаться между различными форматами XML file_info()
, пришлось проанализировать его содержимое и он должен знать, как это выглядит, что заходит слишком далеко.
Это работает в debian. Добавьте это в /etc/magic:
#------------------------------------------------------------------------------
# $File: msooxml,v 1.1 2011/01/25 18:36:19 christos Exp $
# msooxml: file(1) magic for Microsoft Office XML
# From: Ralf Brown <[email protected]>
# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP
# archive. The first member file is normally "[Content_Types].xml".
# Since MSOOXML doesn't have anything like the uncompressed "mimetype"
# file of ePub or OpenDocument, we'll have to scan for a filename
# which can distinguish between the three types
# start by checking for ZIP local file header signature
0 string PK\003\004
# make sure the first file is correct
>0x1E string [Content_Types].xml
# skip to the second local file header
# since some documents include a 520-byte extra field following the file
# header, we need to scan for the next header
>>(18.l+49) search/2000 PK\003\004
# now skip to the *third* local file header; again, we need to scan due to a
# 520-byte extra field following the file header
>>>&26 search/1000 PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have
>>>>&26 string word/ Microsoft Word 2007+
!:mime application/msword
>>>>&26 string ppt/ Microsoft PowerPoint 2007+
!:mime application/vnd.ms-powerpoint
>>>>&26 string xl/ Microsoft Excel 2007+
!:mime application/vnd.ms-excel
>>>>&26 default x Microsoft OOXML
!:strength +10
Затем скажите php использовать /etc/magic в качестве базы данных:
$finfo = finfo_open(FILEINFO_MIME,"/etc/magic");
Это связано с тем, что DOCX является ZIP-файлом:
Файл Office Open XML представляет собой пакет OPC, совместимый с ZIP, содержащий XML-документы и другие ресурсы.
Как и файлы Open Office, документы представляют собой молнии, содержащие различные ресурсы структурированным и четко определенным образом. Поэтому, когда вы пытаетесь идентифицировать содержимое файла, вы сначала видите, что это ZIP-файл. Затем вам нужно будет заглянуть внутрь ZIP, чтобы решить, является ли это DOCX или OpenOffice файл.
В качестве альтернативы вы можете взглянуть на расширение файла: если вы идентифицируете файл как ZIP, а расширение будет .doc
или .docx
, то вы можете предположить, что это файл OOXML.
На apache в.htaccess добавьте это, чтобы исправить проблемы с docx и всеми другими типами файлов:
AddType application/vnd.ms-word.document.macroEnabled.12 .docm
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
AddType application/vnd.ms-powerpoint.template.macroEnabled.12 potm
AddType application/vnd.openxmlformats-officedocument.presentationml.template potx
AddType application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
AddType application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
AddType application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
AddType application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
AddType application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
AddType application/vnd.ms-excel.addin.macroEnabled.12 xlam
AddType application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
AddType application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
AddType application/vnd.ms-excel.template.macroEnabled.12 xltm
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx