El tipo de archivo DOCX en PHP finfo_file es application/zip
validation file-type (5)
En apache en .htaccess, agregue esto, para solucionar el problema de docx y todos los demás tipos de archivos:
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
hola, estoy tratando de validar un tipo de archivo cargado por la función finfo_file .
Pero cuando se envía un archivo .docx, el tipo de archivo es:
application/zip
en lugar de:
application/vnd.openxmlformats-officedocument.wordprocessingml.document
¿Cómo puedo cambiar este comportamiento?
Esto funciona en debian. Agregue esto a / 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
Luego, dile a php que use / etc / magic como su base de datos:
$finfo = finfo_open(FILEINFO_MIME,"/etc/magic");
Esto se debe a que un DOCX es un archivo ZIP :
Un archivo Office Open XML es un paquete OPC compatible con ZIP que contiene documentos XML y otros recursos.
Al igual que los archivos de Open Office, los documentos son ZIP que contienen varios recursos de manera estructurada y bien definida. Entonces, cuando intenta identificar el contenido del archivo, primero ve que es un archivo ZIP. A continuación, deberá buscar en el ZIP para decidir si se trata de un archivo DOCX o OpenOffice.
Como alternativa, puede echar un vistazo a la extensión del archivo: si identifica el archivo como un ZIP y la extensión es .doc
o .docx
, puede asumir que es un archivo OOXML.
Hasta ahora, los tipos de archivos específicos del proveedor (vnd.) No están estandarizados (por ningún RFC) y, por lo tanto, no están cubiertos por file_info (). .docx
es un formato xml comprimido y esa es la razón por la que file_info()
devuelve application_zip
(lo que es completamente correcto). Puede descomprimir el archivo y probar el tipo mime del resultado, pero eso llevará a xml
(lo que también es completamente correcto) y otros archivos, que son utilizados por el documento. Para diferenciar entre los diferentes formatos XML, file_info()
tuvo que analizar su contenido y debe saber cómo se ve, lo que va demasiado lejos.
Tuvimos el mismo problema con PHP 5.3. Funciona bien bajo PHP 7.2. Tengo la aplicación / vnd.openxmlformats-officedocument.wordprocessingml.document para mi archivo docx.
Para asegurarse de que tiene un archivo docx bajo PHP 5.3, verifique el tipo mime en el archivo [Content_Types] .xml en el archivo (docx).