2009-08-05 17 views
15

Estoy usando PHP para enviar un correo electrónico con un archivo adjunto. El archivo adjunto podría ser cualquiera de varios tipos de archivos diferentes (pdf, txt, doc, swf, etc.).¿Cómo obtener el tipo de contenido de un archivo en PHP?

Primero, el script obtiene el archivo usando "file_get_contents".

Más tarde, el guión se hace eco en la cabecera:

Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>" 

Cómo puedo configurar el valor correcto para $ the_content_type?

Respuesta

-2

No es la cabecera de la función:

header('Content-Type: '.$the_content_type); 

Tenga en cuenta que esta función tiene que ser llamado antes cualquier salida. Puede encontrar más detalles en la referencia http://php.net/header

Editar:

Operaciones, me ha entendido mal la pregunta: a partir de PHP 4.0 no es la función mime_content_type para detectar el tipo MIME de un archivo.

En php 5 está en desuso, debe ser reemplazado por el conjunto de funciones file info.

+0

creo que esto no es la cuestión ... ed.talmage tiene que determinar el tipo MIME/tipo de contenido del archivo adjunto, la cabecera ya está en uso cuidado de. – JorenB

+0

¡Atrapado! Por cierto, estaba modificando la respuesta;) – Eineki

4

Aquí hay un ejemplo usando finfo_open que está disponible en PHP5 y PECL:

$mimepath='/usr/share/magic'; // may differ depending on your machine 
// try /usr/share/file/magic if it doesn't work 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
if ($mime===FALSE) { 
throw new Exception('Unable to open finfo'); 
} 
$filetype = finfo_file($mime,$tmpFileName); 
finfo_close($mime); 
if ($filetype===FALSE) { 
throw new Exception('Unable to recognise filetype'); 
} 

Alternativamente, se puede utilizar el obsoleta mime_ content_ type función:

$filetype=mime_content_type($tmpFileName); 

o uso el sistema operativo en funciones incorporadas:

ob_start(); 
system('/usr/bin/file -i -b ' . realpath($tmpFileName)); 
$type = ob_get_clean(); 
$parts = explode(';', $type); 
$filetype=trim($parts[0]); 
-3

probar esto:

function ftype($f) { 
        curl_setopt_array(($c = @curl_init((!preg_match("/[a-z]+:\/{2}(?:www\.)?/i",$f) ? sprintf("%s://%s/%s", "http" , $_SERVER['HTTP_HOST'],$f) : $f))), array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => 1)); 
         return(preg_match("/Type:\s*(?<mime_type>[^\n]+)/i", @curl_exec($c), $m) && curl_getinfo($c, CURLINFO_HTTP_CODE) != 404) ? ($m["mime_type"]) : 0; 

     } 
echo ftype("http://img2.orkut.com/images/medium/1283204135/604747203/ln.jpg"); // print image/jpeg 
+11

¡Operador ternario santo ilegible, Batman! ;-P – deceze

25

estoy usando esta función, que incluye varios mecanismos de emergencia para compensar las versiones anteriores de PHP o resultados simplemente malas:

function getFileMimeType($file) { 
    if (function_exists('finfo_file')) { 
     $finfo = finfo_open(FILEINFO_MIME_TYPE); 
     $type = finfo_file($finfo, $file); 
     finfo_close($finfo); 
    } else { 
     require_once 'upgradephp/ext/mime.php'; 
     $type = mime_content_type($file); 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     $secondOpinion = exec('file -b --mime-type ' . escapeshellarg($file), $foo, $returnCode); 
     if ($returnCode === 0 && $secondOpinion) { 
      $type = $secondOpinion; 
     } 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     require_once 'upgradephp/ext/mime.php'; 
     $exifImageType = exif_imagetype($file); 
     if ($exifImageType !== false) { 
      $type = image_type_to_mime_type($exifImageType); 
     } 
    } 

    return $type; 
} 

Se trata de utilizar la funciones más nuevas de PHP finfo. Si no están disponibles, usa la alternativa mime_content_type e incluye el reemplazo directo de la biblioteca Upgrade.php para asegurarse de que esto exista. Si no devuelve nada útil, probará el comando OS 'file. AFAIK, que solo está disponible en los sistemas * NIX, es posible que desee cambiarlo o deshacerse de él si planea usarlo en Windows. Si nada funcionó, intenta exif_imagetype como reserva para imágenes solamente.

Me he dado cuenta de que los diferentes servidores varían ampliamente en su soporte para las funciones de tipo mime, y que el reemplazo de Upgrade.php mime_content_type está lejos de ser perfecto. Sin embargo, las funciones limitadas de exif_imagetype, tanto la original como la de Upgrade.php, funcionan de manera bastante confiable. Si solo le preocupan las imágenes, es posible que solo desee utilizar esta última.

+0

La alternativa al comando 'file' es redundante. La extensión FileInfo (y la función mime_content_type) usan la misma base de datos de detección de archivos que el comando 'file'. –

+0

@Sander En mis pruebas he encontrado 'mime_content_type' a ser poco fiables, o posiblemente su sustitución upgrade.php era, mientras que el' llamada file' suele tener éxito. Tendré que analizar esto más para ver cuándo y por qué falla en qué circunstancias. Al menos no hace daño estar allí. :) – deceze

+0

Tenía una mirada rápida en el código upgrade.php para mime_content_type. Primero, prueba la extensión FileInfo PECL. Si eso no existe, intenta analizar el archivo 'magic' por sí mismo, en PHP. Problema: solo se ve en algunos lugares predefinidos para el archivo 'magic'. Por ejemplo, falla en mi Debian Squeeze. También es posible que el analizador tenga errores, pero no lo revisé a fondo. –

2
function getMimeType($filename) { 
     $realpath = realpath($filename); 
     if ($realpath 
       && function_exists('finfo_file') 
       && function_exists('finfo_open') 
       && defined('FILEINFO_MIME_TYPE') 
     ) { 
       // Use the Fileinfo PECL extension (PHP 5.3+) 
       return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $realpath); 
     } 
     if (function_exists('mime_content_type')) { 
       // Deprecated in PHP 5.3 
       return mime_content_type($realpath); 
     } 
     return false; 
} 

Esto funcionó para mí

Why is mime_content_type() deprecated in PHP?

0

supongo que encontré una manera corta. Obtener el tamaño de la imagen usando:

$infFil=getimagesize($the_file_name);

y

Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>" 

El getimagesize devuelve un array asociativo que tiene un MIME clave

lo usé y funciona

4

Se muy fácil de tener en php.

simplemente llame a la siguiente función php mime_content_type

<?php 
    $filelink= 'uploads/some_file.pdf'; 
    $the_content_type = ""; 

    // check if the file exist before 
    if(is_file($file_link)) { 
     $the_content_type = mime_content_type($file_link); 
    } 
    // You can now use it here. 

?> 

PHP documentation of the function mime_content_type() espero que ayude a alguien

0

he probado la mayoría de las sugerencias, pero todos fallan para mí (estoy entre medio de cualquier útil versión de PHP al parecer. Terminé con la siguiente función:

function getShellFileMimetype($file) { 
    $type = shell_exec('file -i -b '. escapeshellcmd(realpath($_SERVER['DOCUMENT_ROOT'].$file))); 
    if(strpos($type, ";")!==false){ 
     $type = current(explode(";", $type)); 
    } 
    return $type; 
} 
Cuestiones relacionadas