2011-07-06 15 views
15

hola Estoy intentando validar un tipo de archivo cargado por finfo_file function.Tipo de archivo DOCX en PHP finfo_file es application/zip

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 se puede cambiar este comportamiento?

+1

en realidad, los nuevos formatos \ w {3} x son XML comprimidos. puede cambiar el final a **. zip ** y extraerlos. Sé que no ayuda, pero es bueno saber: D – yoavmatchulsky

+0

extraer el archivo para las pruebas realmente no es una solución – WooDzu

+0

El tipo de archivo _es_ 'zip'. Si desea conocer el tipo/formato del contenido, no hay forma de que lo busquen. – KingCrunch

Respuesta

9

Hasta ahora, los tipos de archivos específicos del vendedor (vnd.) No están estandarizados (por ningún RFC) y, por lo tanto, no están cubiertos por file_info(). .docx es un zipped xml-format y esa es la razón por la cual file_info() devuelve application_zip (lo que está completamente bien). Puede descomprimir el archivo y probar el tipo de mimo del resultado, pero eso llevará al xml (que es completamente correcto también) y a otros archivos que el documento utiliza. Para diferir entre los diferentes formatos XML file_info() tuvo que analizar su contenido y debe saber, cómo se ve, lo que va muy lejos.

+0

Por lo que sé, a menos que extraiga los contenidos y los examine, no hay nada que distinga ningún archivo zip (jar, docx, odf, zip, etc.) de ningún otro. – Quentin

+0

tal vez hay una manera de ponerlos en php.ini de alguna manera? – WooDzu

+3

Incluso si php conoce el tipo mime: 'finfo_file()' está diseñado para obtener el tipo de archivo, no de su contenido. Tampoco es tan fácil distinguir inequívocamente entre estructuras tan complejas. El documento en sí mismo es simplemente 'application/xml', por lo que también debe analizarlo y analizarlo. – KingCrunch

5

Esto se debe a una DOCX is a ZIP file:

Un archivo XML Open Office es un paquete OPC compatible con ZIP que contiene los documentos XML y otros recursos.

Al igual que los archivos de Open Office, los documentos son ZIP que contienen varios recursos de una manera estructurada y bien definida. Por lo tanto, cuando intenta identificar el contenido del archivo, primero ve que es un archivo ZIP. Debería mirar dentro del ZIP para decidir si es un archivo DOCX o OpenOffice.

Como alternativa, podría echar un vistazo a la extensión del archivo: si identifica que el archivo es un ZIP y la extensión pasa a ser .doc o .docx, entonces puede asumir que se trata de un archivo OOXML.

9

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 

Entonces, dirá php para usar/etc/magia como su base de datos:

$finfo = finfo_open(FILEINFO_MIME,"/etc/magic"); 
+0

Basado en http://serverfault.com/a/377792/51569 –

+0

GRACIAS. ¡Probablemente probaré esto! ¿Crees que funcionará con PHP open_basedir? – WooDzu

+0

Esto funciona muy bien para mí cuando lo pruebo con un archivo .docx y he cargado el archivo. Probarlo en mi sistema de archivos local no funcionó. – acorncom

0

en Apache en .htaccess agregar este, para fijar el docx y todos los otros problemas de 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 
Cuestiones relacionadas