Un tipo MIME para archivos. php Al establecer algunas propiedades svn en el trabajo, nos preguntamos sobre el tipo MIME correcto para los archivos. php. Mirando alrededor en las varias listas mágicas de la detección del tipo de MIME en nuestras máquinas de unix y la lista oficial del tipo de MIO de IANA. Las opciones que surgieron fueron: MIME type rulesx200B Ya que no hay un tipo MIME oficial registrado en IANA, solo se puede usar un tipo de extensión (prefijo x) - lo que significa que text / php y application / php no son adecuados: Any El tipo de archivo no registrado debe aparecer con una x-. Como en la aplicación / x-foo (RFC2045 5.1), o una x. . Como en la aplicación / x. foo (RFC4288 4.3). Cualquier tipo no prefijado con x debe ser registrado con IANA y listado en la dirección anterior. Cualquier otro comportamiento es una violación a los estándares MIME Linux distributionsx200B Ubuntus magic MIME base de datos - utilizado por el comando de archivo - escupe texto / x-php. Debians mime-support package, también enviado por Ubuntu, lista application / x-httpd-php para. php y application / x-httpd-php-source para archivos. phps en /etc/mime. types. Estos dos tipos son - en mis ojos - más para el uso interno de Apache / webserver ya que PHP no sólo es utilizable dentro de un daemon http. IANA considerationsx200B Lo que queda son text / x-php y application / x-php. Personalmente, prefiero el texto / para los archivos de texto sin formato legible por el usuario, por lo que era escéptico acerca de la aplicación / x-php al principio. Entonces vi que en 2006, IANA asignó oficialmente la aplicación / javascript para los archivos de código JavaScript - y no texto / javascript. El RFC establece: El uso del tipo de texto de nivel superior para este tipo de contenido se sabe que es problemático. - pero no puede explicar por qué es así. Supongo que esto se debe a que surgen problemas de seguridad desde que los navegadores intentan mostrar cada tipo de texto / MIME como HTML. Un razonamiento similar se utilizó cuando se solicita el tipo JSON MIME que fue asignado oficialmente en RFC 4627. Cuando se le preguntó por qué no texto / json, Crockford parece haber dicho JSON no es realmente javascript ni texto y también IANA era más probable que la mano Aplicación / que texto /. Otros idiomasx200B Al examinar los tipos de texto asignados oficialmente, queda claro que no hay un solo tipo de archivo de fuente de lenguaje de programación en el club. (HTML es, como su nombre indica, un marcado y no un lenguaje de programación - por lo que el texto / html no cuenta.) La lista de aplicaciones / tipos por otro lado contiene tipos como application / ecmascript y application / javascript. Ambos lenguajes de programación. Además, incluso Debian pone varios lenguajes de programación en el grupo de aplicaciones: application / x-ruby. Aplicación / x-sh y aplicación / x-tcl. Downsidesx200B Utilizar application / x-php como tipo MIME para archivos. php no es sin dolor. Un tipo que comienza con texto / indica que el contenido del archivo es legible por el usuario. Puedo abrirlo y obtener un agarre de lo que está sucediendo en el interior, incluso si no entiendo todo cuando no sé el idioma específico del archivo. Puedo utilizar utilidades de texto en él: cat. Grep Sed Diff - usted lo nombra. No debe ser yo mismo que utiliza las herramientas que puede ser una aplicación o un script de shell que escribí que detecta Im trabajando con un archivo de texto y utilizar las herramientas adecuadas. Los archivos con un tipo que comienza con la aplicación / por otro lado pueden ser confiables para ser legibles por máquina solamente. El uso de application / java-vm para archivos. class es totalmente correcto, ya que sólo una computadora puede leerlo, así como application / zip y application / vnd. oasis. opendocument. spreadsheet. Una herramienta que falla mal con application / x-php es la mencionada svn. Detecta archivos de texto como describí, utilizando la parte de medios de tipos MIME. Establecer el tipo MIME de un archivo. php en application / x-php conduce al problema de que maneja los archivos PHP como binarios, por lo que no difiere de ellos, haciendo diffs en proyectos PHP inutilizables. Tuvimos que volver a text / x-php en nuestros repositorios svn. El mismo problema surge cuando se utiliza el tipo de aplicación oficial / javascript. El informe de error asociado sugiere poner una serie de aplicaciones / tipos en esta es una lista de archivos de texto. Y exactamente eso es el problema: ¿Cómo se supone que un programador detecta si un archivo es legible por el usuario y se puede mostrar? Con IANA dictando realidades que derivan hacia aplicaciones / tipos, el tipo MIME ya no es un indicador. Conclusiónx200B Poner los lenguajes de programación bajo el grupo de aplicación tiene significación estadística y también está respaldado por decisiones anteriores de la IANA. Así que parece que es inevitable utilizar application / x-php como tipo MIME para archivos. php - pero hace que la vida de un desarrollador sea más difícil. Imagetypetomimetype Estaba buscando para detectar el formato de las imágenes, no estoy seguro de si esta es la mejor manera, pero funciona para mi. Imagen del caso del interruptor (tamaño mime) / gif. La imagen del eco es una imagen / jpeg del caso de la fractura del GIF. Echo Image es una imagen jpeg break case / png. Echo Image es una imagen de caso de ruptura png / bmp. Echo La imagen es una ruptura del bmp gt Cartografía el tipo de la imagen enum a la extensión del archivo: el arsenal de las extensiones (IMAGETYPEGIF gt gif, IMAGETYPEJPGG gt jpg, IMAGETYPEPNG gt png, IMAGETYPESWF gt swf, IMAGETYPEPSP gt psd, IMAGETYPETIFFII gt bmp, IMAGETYPETIFFMM gt tiff , IMAGETYPEJPC gt jpc, IMAGETYPEJP2 gt jp2, IMAGETYPEJPX gt jpx, IMAGETYPEJB2 gt jb2, IMAGETYPESWC gt swc, IMAGETYPEIFF gt iff, IMAGETYPEWBMP gt wbmp, IMAGETYPEXBM gt xbm, IMAGETYPEICO gt ico) finfofile finfo :: file Tentador como puede parecer utilizar finfofile () Para validar los archivos de imagen subidos (compruebe si un archivo de imagen supuestamente contiene una imagen), no se puede confiar en los resultados. No es tan difícil de envolver código ejecutable dañino en un archivo identificado como un GIF por ejemplo. Una mejor opción amp más segura es comprobar el resultado de: if (img imagecreatefromgif (uploadedfilename)) triggererror (No es una imagen GIF, EUSERWARNING) // hacer cosas necesarias Bueno, tengo un gran problema con eso, MS Office 2007 extensiones (pptx , Xlsx, docx) no tienen un tipo Mime predeterminado, tienen tipo de aplicación / zip mime, por lo que, para arreglar eso, hago una pequeña función para verificar la extensión. Esa función le permite estar seguro de falsas extensiones hack. Array array array (aplicación / zip. Application / x-zip. Application / x-zip comprimido) arrayExtensions array (.pptx. docx. dotx. xlsx) originalextension (false pos strrpos (archivo ...)). . (File) finfo new finfo (FILEINFOMIME) tipo finfo - gt file (archivo) if (inarray (tipo. ArrayZips) ampamp inarray (originalextension arrayExtensions)) return originalextension La manera HOWTO obtener MIME-tipo de archivo remoto. Ltphp class MIMEStreamWrapper const WRAPPERNAME mime contexto público private static isRegistered false private privateBlackFunction private eof false private private private private private fileFun private function getStat private function getStat () si (fStat fstat (este - gt fp)) devuelve fStat tamaño 100 if (headers getheaders (this - Gt path true)) head arraychangekeycase (encabezados, CASELOWER) tamaño (int) cabeza contenido-longitud bloques ceil (tamaño / 512) matriz de devolución (dev gt 16777220, ino gt 15764, modo gt 33188, nlink gt 1, uid gt 10000 , Gt gt 80, rdev gt 0, tamaño gt tamaño, atime gt 0, mtime gt 0, gt gt 0, blksize gt 4096, bloques gt bloques,) public function setPath (ruta) this - gt path path - gt fp fopen (This - gt path. Rb) o die (No se puede abrir el archivo:.gt path) this - gt fileStat this - gt getStat () public function leer (count) return fread (this - gt fp. Count) public function getStreamPath () Devuelve strreplace (array (ftp: //..), Self. WRAPPERNAME.: //. This - gt path) función pública getContext () if (self. IsRegistered) streamwrapperregister (self. WRAPPERNAME. Getclass ()) self. IsRegistered true return streamcontextcreate (matriz (self. WRAPPERNAME array gt (cb gt array (this read), fileStat gt this - gt fileStat,))) public function streamopen Rbt /. Mode) Este contexto - gt) devuelve false opt streamcontextgetoptions (este contexto - gt) if (isarray (opt self) WRAPPERNAME cb) iscallable (opt self. Este - gt callBackFunction opta por ti mismo. WRAPPERNAME cb this - gt fileStat opta por ti mismo. WRAPPERNAME fileStat devuelve true public function streamread (cuenta) if (this - gt eof. Count) devuelve if ((calluserfunc) Gt eof función pública streamstat () return this - gt fileStat función pública streamcast (castAs) leer null write null excepto null return streamselect (leer, escribir, excepto castAs) path fc04.deviantart. net/fs71/f/2010/227/ 4/6 / PNGTestbyDestron23.png echo Archivo:. camino. N wrapper nuevo MimeStreamWrapper () wrapper - gt setPath (ruta) fInfo nuevo finfo (FILEINFOMIME) echo MIME-type:. FInfo - gt file (wrapper - gt getStreamPath (), FILEINFOMIMETYPE. Wrapper - gt getContext ()), n gt Yo estaba recibiendo application / octet-stream o lt no es compatible con todos los archivos. Descubrí que en PHP 5.3 el archivo mágico está incorporado en PHP y eso es lo que se debe usar. El archivo mágico encontrado en el sistema puede no ser siempre lo que libmagic espera, de ahí el error. Otra característica interresting de finfofile en Windows. Esta función puede devolver una cadena vacía en lugar de FALSE para algunos tipos de archivo (ppt por ejemplo). Por lo tanto, para asegurarse de hacer una comprobación triple del resultado de salida y proporcionar el tipo predeterminado por si acaso. Aquí está un código de ejemplo: ftype aplicación / octeto-flujo finfo finfoopen (FILEINFOMIME) si (finfo FALSO) finfin (finfo, archivo) if ((FALSO) ampamp (fres) amp (strlen (fres) gt0) Fres finfoclose (finfo) Mientras que averiguar mi problema con esta nueva función, tuve una onda cerebral en el uso de la ruta completa del archivo en lugar de la ruta relativa. Por ejemplo: carpeta ltphp carpeta / fileName aFile. pdf finfo finfoopen (FILEINFOMIMETYPE) finfofile (finfo. Carpeta. FileName) gt Esto resultará en un error donde no puede encontrar el archivo especificado. Esto sin embargo fijxes ese problema: ltphp carpeta somefolder / fileName aFile. pdf finfo finfoopen (FILEINFOMIMETYPE) mime finfofile (finfo. Dirname (FILE) ./. Folder. FileName) gt Aquí hay un contenedor que identificará correctamente los documentos de Microsoft Office 2007. Es trivial y sencillo de usar, editar y agregar más extensiones / mimetypes de archivos. Ltphp function getmimetype (ruta de acceso de archivo) if (pregmatch (/.//. Filepath))) devuelve finfofile (finfoopen (FILEINFOMIMETYPE), filepath) switch (strtolower (pregreplace (/../. Docs case docx: devuelve la aplicación / vnd. openxmlformats-officedocument. wordprocessingml. document case docm: devuelve la aplicación / vnd. ms-word. document. macroEnabled.12 caso dotx: return application / vnd. openxmlformats-officedocument. wordprocessingml. template case dotm : Return application / vnd. ms-word. template. macroEnabled.12 caso xlsx: return application / vnd. openxmlformats-officedocument. spreadsheetml. sheet caso xlsm: return application / vnd. ms-excel. sheet. macroEnabled.12 case xltx: Return application / vnd. openxmlformats-officedocument. spreadsheetml. template caso xltm: devuelve la aplicación / vnd. ms-excel. template. macroEnabled.12 caso xlsb: devuelve la aplicación / vnd. ms-excel. sheet. binary. macroEnabled.12 case xlam : Return application / vnd. ms-excel. addin. macroEnabled.12 caso pptx: devuelve la aplicación / vnd. openxmlformats-officedocument. presentationml. presentation case pptm: devuelve la aplicación / vnd. ms-powerpoint. presentation. macroEnabled.12 caso ppsx: Return application / vnd. openxmlformats-officedocument. presentationml. slideshow case ppsm: devuelve la aplicación / vnd. ms-powerpoint. slideshow. macroEnabled.12 case potx: devuelve la aplicación / vnd. openxmlformats-officedocument. presentationml. template caso potm: return application / Vnd. ms-powerpoint. template. macroEnabled.12 caso ppam: return application / vnd. ms-powerpoint. addin. macroEnabled.12 caso sldx: return application / vnd. openxmlformats-officedocument. presentationml. slide caso sldm: return application / vnd. ms-powerpoint. slide. macroEnabled.12 caso uno: devolver aplicación / caso msonenote onetoc2: devolver aplicación / msonenote caso onetmp: devolver aplicación / msonenote caso onepkg: devolver aplicación / msonenote caso thmx: return application / vnd. ms-officetheme / / END MS Office 2007 Docs devuelve finfofile (finfoopen (FILEINFOMIMETYPE), filepath) Sólo una mejora en la muestra Ryan Day publicado - ligeramente fuera de tema ya que este método no utiliza finfofile pero en algunos casos este método podría ser preferible. El cambio principal es el formato - m parámetros dados a la llamada de identificación. Yo sugeriría usar la ruta completa del sistema para identificar i. e. / usr / bin / identifier para ser un poco más seguro (la ubicación puede cambiar de servidor a servidor). // si se utiliza el sistema () echos STDOUT automáticamente si (vacía (salida)) // identifica devuelve un resultado vacío (/ usr / bin / A php // si el archivo no es una imagen
No comments:
Post a Comment