2011-11-22 11 views
8

Noté que get_mime() ahora está depreciado, entonces ¿cuál sería una forma alternativa de crear la siguiente función? Esta función se usa a través de un cms con el que trabajo, por lo que necesito una alternativa confiable.PHP Mime revisando el tipo de forma alternativa de hacerlo?

// Mime Type Checker 
function get_mime ($filename,$mode=0) { 

    // mode 0 = full check 
    // mode 1 = extension check only 

    $mime_types = array(

     'txt' => 'text/plain', 
     'htm' => 'text/html', 
     'html' => 'text/html', 
     'php' => 'text/html', 
     'css' => 'text/css', 
     'js' => 'application/javascript', 
     'json' => 'application/json', 
     'xml' => 'application/xml', 
     'swf' => 'application/x-shockwave-flash', 
     'flv' => 'video/x-flv', 

     // images 
     'png' => 'image/png', 
     'jpe' => 'image/jpeg', 
     'jpeg' => 'image/jpeg', 
     'jpg' => 'image/jpeg', 
     'gif' => 'image/gif', 
     'bmp' => 'image/bmp', 
     'ico' => 'image/vnd.microsoft.icon', 
     'tiff' => 'image/tiff', 
     'tif' => 'image/tiff', 
     'svg' => 'image/svg+xml', 
     'svgz' => 'image/svg+xml', 

     // archives 
     'zip' => 'application/zip', 
     'rar' => 'application/x-rar-compressed', 
     'exe' => 'application/x-msdownload', 
     'msi' => 'application/x-msdownload', 
     'cab' => 'application/vnd.ms-cab-compressed', 

     // audio/video 
     'mp3' => 'audio/mpeg', 
     'qt' => 'video/quicktime', 
     'mov' => 'video/quicktime', 

     // adobe 
     'pdf' => 'application/pdf', 
     'psd' => 'image/vnd.adobe.photoshop', 
     'ai' => 'application/postscript', 
     'eps' => 'application/postscript', 
     'ps' => 'application/postscript', 

     // ms office 
     'doc' => 'application/msword', 
     'rtf' => 'application/rtf', 
     'xls' => 'application/vnd.ms-excel', 
     'ppt' => 'application/vnd.ms-powerpoint', 
     'docx' => 'application/msword', 
     'xlsx' => 'application/vnd.ms-excel', 
     'pptx' => 'application/vnd.ms-powerpoint', 


     // open office 
     'odt' => 'application/vnd.oasis.opendocument.text', 
     'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 
    ); 

    $ext = strtolower(array_pop(explode('.',$filename))); 

    if (function_exists('mime_content_type') && $mode==0) { 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 
    } 

    if (function_exists('finfo_open') && $mode==0) { 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 

    } elseif (array_key_exists($ext, $mime_types)) { 
     return $mime_types[$ext]; 
    } else { 
     return 'application/octet-stream'; 
    } 
} 
+0

intente utilizar las funciones de información de archivos. puede ser que pueda obtener sus resultados usando http://www.php.net/manual/en/ref.fileinfo.php – jeni

+0

FYI: [Generar tipo MIME en PHP no es Magia] (https://chrisjean.com/2009/02/14/generate-mime-type-in-php-is-not-magic /) –

Respuesta

9

finfo_file es el reemplazo de mime_content_type.

Como finfo_file solo está disponible en PHP 5.3.0+, lo que ha hecho es correcto. Si finfo_file está disponible, utilícelo, de lo contrario vuelva a mime_content_type, que debería estar disponible si no podemos usar finfo_file.

Usted debe actualizar su cuenta de cheques condicional como esto:

if(function_exists('mime_content_type')&&$mode==0){ 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 

}elseif(function_exists('finfo_open')&&$mode==0){ 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 
}elseif(array_key_exists($ext, $mime_types)){ 
     return $mime_types[$ext]; 
}else { 
     return 'application/octet-stream'; 
} 
+0

Gracias ... Este trabajo para godaddy.com hosting issue .. – Sri

1

que he usado algo como esto hace un tiempo, parece que funciona bien siempre y cuando tenga la versión PHP> 5.3.0:

$fn = "/dir/filename.whatever" 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
$filetype = finfo_file($mime,$fn); 
finfo_close($mime); 

Nota; Recuerdo que $mimepath es una variable que no está configurada. Eso dará como resultado finfo_open() usando un valor predeterminado para su segundo parámetro.

+2

Tenga en cuenta que esto podría devolver una cadena como "video/x-flv; charset = binary" y es posible que no desee la " charset = binary "part. Sugeriría agregar esta línea al final del código anterior si desea devolver solo el tipo mime: $ mimetype = substr ($ mimetype, 0, strpos ($ mimetype, ';')); – Andrew

0
$mime = `file --mime-type $path`; 
$mime = trim(array_pop(explode(':', $mime))); 

Esto funciona para mí.

+0

funciona también para mí –

+1

'file -b --mime-type $ path' funciona sin la necesidad de' trim (array_pop (explode (':', $ mime))); ' –

+4

Lo sentimos, pero hay verdaderas preocupaciones de seguridad a tener en cuenta con este enfoque. Los ticks ejecutan un comando de shell por lo que debe * limpiar * en gran medida '$ ruta ', si desea hacer mimos verificando de esta manera. Además, está utilizando un comando POSIX que no tiene garantía de estar en el sistema (es decir, Windows, distribución Linux personalizada, otro sistema operativo). –