Comment obtenir le type MIME D'un fichier en PHP 5.5?
j'utilise mime_content_type()
en PHP 5.5 pour obtenir un type MIME, mais il lance fatal: error function not found
.
comment réaliser cela sur PHP 5.5?
8 réponses
utiliser les fonctions finfo()
.
une simple illustration:
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, "path/to/image_dir/image.gif");
finfo_close($finfo);
OUTPUT :
image/gif
Note : les utilisateurs de Windows doivent inclure le fichier DLL empaqueté php_fileinfo.dll
dans php.ini pour activer cette extension.
j'ai passé trop de temps à essayer d'obtenir la finfo fonctions fonctionner correctement. J'ai finalement fini par créer ma propre fonction pour faire correspondre l'extension du fichier à n'importe quel tableau de types mime. Ce n'est pas un moyen de s'assurer que les fichiers sont vraiment ce que l'extension indique qu'ils sont, mais ce problème peut être atténué par la façon dont vous traitez les entrées/sorties de ces fichiers sur votre(s) serveur (s).
function mime_type($file) {
// there's a bug that doesn't properly detect
// the mime type of css files
// https://bugs.php.net/bug.php?id=53035
// so the following is used, instead
// src: http://www.freeformatter.com/mime-types-list.html#mime-types-list
$mime_type = array(
"3dml" => "text/vnd.in3d.3dml",
"3g2" => "video/3gpp2",
"3gp" => "video/3gpp",
"7z" => "application/x-7z-compressed",
"aab" => "application/x-authorware-bin",
"aac" => "audio/x-aac",
"aam" => "application/x-authorware-map",
"aas" => "application/x-authorware-seg",
"abw" => "application/x-abiword",
"ac" => "application/pkix-attr-cert",
"acc" => "application/vnd.americandynamics.acc",
"ace" => "application/x-ace-compressed",
"acu" => "application/vnd.acucobol",
"adp" => "audio/adpcm",
"aep" => "application/vnd.audiograph",
"afp" => "application/vnd.ibm.modcap",
"ahead" => "application/vnd.ahead.space",
"ai" => "application/postscript",
"aif" => "audio/x-aiff",
"air" => "application/vnd.adobe.air-application-installer-package+zip",
"ait" => "application/vnd.dvb.ait",
"ami" => "application/vnd.amiga.ami",
"apk" => "application/vnd.android.package-archive",
"application" => "application/x-ms-application",
// etc...
// truncated due to Stack Overflow's character limit in posts
);
$extension = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));
if (isset($mime_type[$extension])) {
return $mime_type[$extension];
} else {
throw new \Exception("Unknown file type");
}
}
Edit:
Je voudrais m'adresser à Davuz's comment (depuis il continue à obtenir voté) et rappeler à tout le monde que j'ai mis dans le pseudo disclaimer en haut que ce n'est pas "full-proof."Donc, gardez cela à l'esprit lorsque l'on considère l'approche que j'ai offert à ma réponse.
mime_content_type()
n'est pas obsolète et fonctionne très bien.
pourquoi mime_content_type() est-il déprécié en PHP?
http://php.net/manual/en/function.mime-content-type.php
en PHP 5.3, c'est même intégré .
$finfo = finfo_open(FILEINFO_MIME_TYPE);
devrait suffire.
extrait du php.net docs. Votre fonction est dépréciée et probablement déjà supprimée.
vous devez comprendre que file_get_contents va télécharger le fichier entier à la mémoire, ce n'est pas une bonne façon d'obtenir seulement le type mime. Vous n'avez pas besoin d'utiliser tampon "151950920 méthode" et file_get_contents de la fonction dans ce cas.
pour éviter les erreurs et les Avertissements, mieux vaut faire comme ceci.
$filename = 'path to your file';
if (class_exists('finfo')) {
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (is_object($finfo)) {
echo $finfo->file($filename);
}
} else {
echo 'fileinfo did not installed';
}
aussi, vous devriez savoir $finfo- > le fichier lancera Avertissement PHP en cas de panne.
si fileinfo n'est pas installé correctement, et que vous avez une nouvelle version de PHP, vous pouvez obtenir le type mime des en-têtes.
vous pouvez utiliser cURL pour obtenir le type mime des en-têtes.
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 1,
CURLOPT_URL => $link)
);
$headers = curl_exec($ch);
curl_close($ch);
if (preg_match('/Content-Type:\s(.*)/i', $headers, $matches)) {
echo trim($matches[1], "\t\n\r");
}else {
echo 'There is no content type in the headers!';
}
vous pouvez aussi utiliser la fonction get_headers , mais elle est plus lente que cURL request.
$url = 'http://www.example.com';
$headers = get_headers($url, 1);
echo $headers['Content-Type'];
obtenir la taille de l'image en utilisant:
$infFil=getimagesize($the_file_name);
et
echo $infFil["mime"]
le getimagesize
renvoie un tableau associatif qui a une clé MIME et évidemment la taille de l'image aussi
je l'ai utilisé et ça marche
j'utilise le MimeTypeTool de Bat ( https://github.com/lingtalfi/Bat )
il utilise fileinfo si disponible, et renvoie par défaut à un mappage" extension => mime type".
C'est la meilleure solution que j'ai trouvé par la combinaison de deux très bons postes
/ / merci à http://php.net/manual/en/function.mime-content-type.php#87856
function getMimeContentType($filename, $ext)
{
if(!function_exists('mime_content_type'))
{
if($mime_types = getMimeTypes())
{
if (array_key_exists($ext, $mime_types))
{
return $mime_types[$ext];
}
elseif (function_exists('finfo_open'))
{
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mimetype;
}
}
return 'application/octet-stream';
}
return mime_content_type($filename);
}
/ / merci à http://php.net/manual/en/function.mime-content-type.php#107798
function getMimeTypes()
{
$url = 'http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types';
$mimes = array();
foreach(@explode("\n",@file_get_contents($url)) as $x)
{
if(isset($x[0]) && $x[0]!=='#' && preg_match_all('#([^\s]+)#', $x, $out) && isset($out[1]) && ($c = count($out[1])) > 1)
{
for($i=1; $i < $c; $i++)
{
$mimes[$out[1][$i]] = $out[1][0];
}
}
}
return (@sort($mimes)) ? $mimes : false;
}
utilisez le lien suivant:
$filename = '/path/to/the/file.pdf';
$ext = strtolower(array_pop(explode('.',$filename)));
$content_type = getMimeContentType($filename, $ext);
continuera à fonctionner même si le la fonction mime_content_type n'est plus supportée en php.