comment puis-je vérifier si un fichier est un fichier mp3 ou un fichier image, autre que vérifier chaque extension possible?
Vous pouvez identifier les fichiers image à l’aide de getimagesize
.
Pour en savoir plus sur les fichiers MP3 et autres fichiers audio/vidéo, on m'a recommandé php-mp4info getID3 () .
Façons natives d'obtenir le type MIME:
Pour PHP <5.3, utilisez mime_content_type ()
Pour PHP> = 5.3, utilisez finfo_fopen ()
Les options possibles pour obtenir le type Mime sont exif_imagetype et getimagesize , mais elles reposent sur l’installation des bibliothèques appropriées. De plus, ils ne renverront probablement que des types d'image MIME, au lieu de la liste complète donnée dans magic.mime .
Si vous ne voulez pas vous soucier de ce qui est disponible sur votre système, enveloppez simplement les quatre fonctions dans une méthode proxy qui délègue l'appel de fonction à ce qui est disponible, par exemple.
function getMimeType($filename)
{
$mimetype = false;
if(function_exists('finfo_fopen')) {
// open with FileInfo
} elseif(function_exists('getimagesize')) {
// open with Gd
} elseif(function_exists('exif_imagetype')) {
// open with EXIF
} elseif(function_exists('mime_content_type')) {
$mimetype = mime_content_type($filename);
}
return $mimetype;
}
Pour trouver le type mime d'un fichier, j'utilise la fonction wrapper suivante:
function Mime($path)
{
$result = false;
if (is_file($path) === true)
{
if (function_exists('finfo_open') === true)
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (is_resource($finfo) === true)
{
$result = finfo_file($finfo, $path);
}
finfo_close($finfo);
}
else if (function_exists('mime_content_type') === true)
{
$result = preg_replace('~^(.+);.*$~', '$1', mime_content_type($path));
}
else if (function_exists('exif_imagetype') === true)
{
$result = image_type_to_mime_type(exif_imagetype($path));
}
}
return $result;
}
<?php
echo mime_content_type('php.gif') . "\n";
echo mime_content_type('test.php');
?>
Sortie:
image/gif
texte simple
Ou mieux, utilisez finfo_file () dans l’autre voie est obsolète .
getimageinfo est préférable pour trouver des images. Vérifiez si le type de retour est faux.
Vous pouvez utiliser finfo comme ceci:
$mime = finfo_open(FILEINFO_MIME, $path_to_mime_magic_file);
if ($mime ===FALSE) {
throw new Exception ('Finfo could not be run');
}
$filetype = finfo_file($mime, $filename);
finfo_close($mime);
ou si vous ne parvenez pas à installer finfo ou si le fichier magique mime ne fonctionne tout simplement pas (il fonctionne correctement sur 3 serveurs sur 4, tous identiques et PHP installés), puis utilisez le système natif de Linux. file (n'oubliez pas cependant de nettoyer le nom du fichier: dans cet exemple, je sais que le nom du fichier peut être approuvé car il s'agit d'un _ nom de fichier temporaire PHP dans mon code de test):
ob_start();
system('file -i -b '.$filename);
$output = ob_get_clean();
$output = explode("; ", $output);
if (is_array($output)) {
$filetype = trim($output[0]);
}
Ensuite, passez simplement le type de fichier mime à une instruction switch telle que:
switch (strtolower($filetype)) {
case 'image/gif':
return '.gif';
break;
case 'image/png':
return '.png';
break;
case 'image/jpeg':
return '.jpg';
break;
case 'audio/mpeg':
return '.mp3';
break;
}
return null;
Vous pouvez utiliser le module FileInfo intégré à PHP depuis 5.3. Si vous utilisez une version PHP inférieure à PHP 5.3, vous pouvez l'installer en tant qu'extension PECL:
Après l’installation, la fonction finfo_file
renvoie les informations sur le fichier.
Extension PECL: http://pecl.php.net/package/fileinfo
Documentation PHP: http://www.php.net/manual/fr/book.fileinfo.php
Cette fonction vérifie si le fichier est une image basée sur l'extension et le mime et renvoie true s'il s'agit d'une image compatible avec le navigateur ...
function checkImage($image) {
//checks if the file is a browser compatible image
$mimes = array('image/gif','image/jpeg','image/pjpeg','image/png');
//get mime type
$mime = getimagesize($image);
$mime = $mime['mime'];
$extensions = array('jpg','png','gif','jpeg');
$extension = strtolower( pathinfo( $image, PATHINFO_EXTENSION ) );
if ( in_array( $extension , $extensions ) AND in_array( $mime, $mimes ) ) return TRUE;
else return FALSE;
}
Le meilleur moyen consiste à utiliser la fonction finfo_file. Exemple:
<?php
if (isset($_FILES['yourfilename']['tmp_name'])) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['yourfilename']['tmp_name']);
if ($mime == 'image/jpg') {
echo "It's an jpg image!";
}
finfo_close($finfo);
}
?>
Cette fonction obtient un chemin de fichier et avec finfo_open
et mime_content_type
si elle est prise en charge, renvoie la chaîne image
ou video
ou audio
.
/**
* get file type
* @return image, video, audio
*/
public static function getFileType($file)
{
if (function_exists('finfo_open')) {
if ($info = finfo_open(defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME)) {
$mimeType = finfo_file($info, $file);
}
} elseif (function_exists('mime_content_type')) {
$mimeType = mime_content_type($file);
}
if (strstr($mimeType, 'image/')) {
return 'image';
} else if (strstr($mimeType, 'video/')) {
return 'video';
} else if (strstr($mimeType, 'audio/')) {
return 'audio';
} else {
return null;
}
}
Pour les images, j'utilise:
function is_image($path)
{
$a = getimagesize($path);
$image_type = $a[2];
if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
{
return true;
}
return false;
}