Pregunta

Bien, tengo un archivo index.php que tiene que procesar muchos tipos de archivos diferentes. ¿Cómo supongo que el tipo de archivo se basa en el REQUEST_URI ?

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

<?php
   include('/www/site'.

Bien, tengo un archivo index.php que tiene que procesar muchos tipos de archivos diferentes. ¿Cómo supongo que el tipo de archivo se basa en el REQUEST_URI ?

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

<*>

¿Cómo puedo hacer que funcione correctamente?

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

SERVER['REQUEST_URI']); ?>

¿Cómo puedo hacer que funcione correctamente?

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

¿Fue útil?

Solución

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

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

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

Otros consejos

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

Si está ejecutando en un servidor * nix, puede hacer lo siguiente, lo que me ha funcionado bien:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
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://stackoverflow.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.

En realidad, me harté de la falta de estándar métodos MIME de detección en PHP. Instale fileinfo ... Use funciones en desuso ... ¡Oh, esto funciona, pero solo para imágenes! Me harté de eso, así que investigué un poco y encontré la WHATWG Mimesniffing spec : creo que esto Sin embargo, sigue siendo un borrador de especificación.

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 rastrear 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.

Si está trabajando solo con imágenes y necesita un tipo mime (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));

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

Según el manual de php, el archivo finfo La función es la mejor manera de hacer esto. Sin embargo, deberá instalar la FileInfo extensión PECL.

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

mime_content_type () parece ser el camino a seguir, a pesar de los comentarios anteriores que dicen que está en desuso. No está, 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 de forma predeterminada a partir de PHP 5.3.0.

Puedes 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 obtienes una cadena más detallada para algunos archivos; (Al parecer, 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án disponibles (por ejemplo, image / png; charset = binary o text / x-php; charset = us-ascii). Consulte este sitio para obtener más información.

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

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

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

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

que no utiliza finfo, exec o función en desuso

funciona bien también con recursos remotos!

Si solo estás tratando con imágenes, puedes 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 / es / ref.fileinfo.php

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

Si ejecuta Linux y tiene la extensión, simplemente podría leer el tipo MIME desde /etc/mime.types haciendo una matriz de hash. Luego, puede almacenar eso en la memoria y simplemente llamar al MIME por clave 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;
}

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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top