verificar type txt tipo que info for finfo_open agregar php filesystems http-headers content-type

type - ¿Cómo encuentro el tipo mime de un archivo con php?



que es mime type (13)

Ok, entonces tengo un archivo index.php que tiene que procesar muchos tipos de archivos diferentes. ¿cómo puedo adivinar el tipo de archivo basado en REQUEST_URI ?

Si solicito http://site/image.jpg , y todas las solicitudes redirigen a través de index.php, que se parece a esto

<?php include(''/www/site''.$_SERVER[''REQUEST_URI'']); ?>

¿Cómo haría que eso funcione correctamente?

¿Debo realizar una prueba en función de la extensión del archivo solicitado, o existe alguna forma de obtener el tipo de archivo?


De acuerdo con el manual php, la función finfo-file es la mejor manera de hacerlo. Sin embargo, deberá instalar la extensión FileInfo PECL.

Si la extensión no es una opción, puede usar la función obsoleta mime_content_type .


De hecho, me cansé de la falta de métodos estándar de detección de MIME en PHP. Instalar fileinfo ... Usar funciones obsoletas ... ¡Oh, esto funciona, pero solo para imágenes! Me cansé de eso, así que investigué y encontré la especificación WHATWG Mimesniffing. Sin embargo , creo que esto sigue siendo un borrador.

De todos modos, usando esta especificación, pude implementar un mimesniffer en PHP. El rendimiento no es un problema. De hecho, en mi humilde máquina, pude abrir y husmear miles de archivos antes de que se agotara el tiempo de espera de PHP.

Aquí está la clase MimeReader .

require_once("MimeReader.php"); $mime = new MimeReader(<YOUR FILE PATH>); $mime_type_string = $mime->getType(); // "image/jpeg" etc.


El mimo de cualquier archivo en su servidor se puede obtener con este

<?php function get_mime($file_path){ $finfo = new finfo(FILEINFO_MIME_TYPE); $type = $finfo->file(file_path); } $mime = get_mime(''path/to/file.ext'');


No lo he usado, pero hay una extensión PECL para obtener el tipo mimet de un archivo. La documentación oficial para ello está en el manual .

Dependiendo de sus propósitos, una extensión de archivo puede estar bien, pero no es increíblemente confiable ya que se puede cambiar tan fácilmente.


Puede usar finfo para lograr esto a partir de PHP 5.3:

<?php $info = new finfo(FILEINFO_MIME_TYPE); echo $info->file(''myImage.jpg''); // prints "image/jpeg"

El indicador FILEINFO_MIME_TYPE es opcional; sin él se obtiene una cadena más detallada para algunos archivos; (Aparentemente, algunos tipos de imágenes devolverán información de tamaño y profundidad de color). El uso del indicador FILEINFO_MIME devuelve el tipo mime y la codificación si está disponible (por ejemplo, image / png; charset = binary o text / x-php; charset = us-ascii). Vea este sitio para más información.


Si ejecuta Linux y tiene la extensión, puede simplemente leer el tipo MIME desde /etc/mime.types haciendo una matriz hash. A continuación, puede almacenar eso en la memoria y simplemente llamar al MIME mediante la tecla de matriz :)

/** * Helper function to extract all mime types from the default Linux /etc/mime.types */ function get_mime_types() { $mime_types = array(); if ( file_exists(''/etc/mime.types'') && ($fh = fopen(''/etc/mime.types'', ''r'')) !== false ) { while (($line = fgets($fh)) !== false) { if (!trim($line) || substr($line, 0, 1) === ''#'') continue; $mime_type = preg_split(''//t+/'', rtrim($line)); if ( is_array($mime_type) && isset($mime_type[0]) && $mime_type[0] && isset($mime_type[1]) && $mime_type[1] ) { foreach (explode('' '', $mime_type[1]) as $ext) { $mime_types[$ext] = $mime_type[0]; } } } fclose($fh); } return $mime_types; }


Si está seguro de que solo trabaja con imágenes, puede consultar getimagesize() exif_imagetype() Función PHP, que intenta devolver la imagen tipo mime.

Si no le molestan las dependencias externas, también puede consultar la excelente biblioteca getID3 , que puede determinar el tipo de mime de muchos tipos de archivos diferentes.

Por último, puede verificar la función mime_content_type() , pero ha quedado en desuso para la extensión PECL de Fileinfo .


Si solo está trabajando con imágenes y necesita un tipo de mimo (por ejemplo, para encabezados), esta es la respuesta más rápida y directa:

$file = ''path/to/image.jpg''; $image_mime = image_type_to_mime_type(exif_imagetype($file));

Emitirá un tipo de mime de imagen real incluso si cambia el nombre de su archivo de imagen


Si solo se trata de imágenes, puede usar la función [getimagesize()][1] que contiene todo tipo de información sobre la imagen, incluido el tipo.

Un enfoque más general sería usar la extensión FileInfo de PECL. La documentación de PHP para esta extensión se puede encontrar en: http://us.php.net/manual/en/ref.fileinfo.php

Algunas personas tienen serias quejas sobre esa extensión ... así que si se encuentra con problemas graves o no puede instalar la extensión por alguna razón, es posible que desee verificar la función obsoleta mime_content_type()


mime_content_type () está en desuso, por lo que no podrá contar con que funcione en el futuro. Hay una extensión PECL "fileinfo", pero no he escuchado cosas buenas al respecto.

Si está ejecutando en un servidor * nix, puede hacer lo siguiente, que funcionó bien para mí:

$file = escapeshellarg( $filename ); $mime = shell_exec("file -bi " . $file); $filename should probably include the absolute path.


obtuve muy buenos resultados utilizando una función de usuario de http://php.net/manual/de/function.mime-content-type.php @ '''' john dot howard en prismmg dot com 26-Oct-2009 03:43 '' ''

function get_mime_type($filename, $mimePath = ''../etc'') { ...

que no usa la función finfo, exec o obsoleta

funciona bien también con recursos remotos!


mime_content_type() parece ser el camino a seguir, a pesar de los comentarios anteriores que dicen que está en desuso. No es - o al menos esta encarnación de mime_content_type() no está en desuso, de acuerdo con http://php.net/manual/en/function.mime-content-type.php . Es parte de la extensión FileInfo, pero la documentación de PHP ahora nos dice que está habilitada por defecto a partir de PHP 5.3.0.


function get_mime($file) { if (function_exists("finfo_file")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension $mime = finfo_file($finfo, $file); finfo_close($finfo); return $mime; } else if (function_exists("mime_content_type")) { return mime_content_type($file); } else if (!stristr(ini_get("disable_functions"), "shell_exec")) { // http://.com/a/134930/1593459 $file = escapeshellarg($file); $mime = shell_exec("file -bi " . $file); return $mime; } else { return false; } }

Para mí, nada de esto funciona: mime_content_type está en desuso, finfo no está instalado y shell_exec no está permitido.