OO (bit improved) version of the same thing
<?php
$file = '<somefile>';
$ftype = 'application/octet-stream';
$finfo = @new finfo(FILEINFO_MIME);
$fres = @$finfo->file($file);
if (is_string($fres) && !empty($fres)) {
$ftype = $fres;
}
?>
finfo_file
(PECL fileinfo:0.1-1.0.4)
finfo_file — Retourne des informations à propos d'un fichier
Description
string finfo_file
( resource $finfo
, string $file_name
[, int $options
[, resource $context
]] )
finfo
Cette fonction est utilisée pour récupérer des informations à propos d'un fichier.
Liste de paramètres
- finfo
-
Ressource Fileinfo retournée par finfo_open().
- file_name
-
Nom d'un fichier à être vérifié.
- options
-
Une ou une union de plusieurs constantes Fileinfo.
- context
-
Pour une description de contexts, référez-vous à Fonctions sur les flux.
Valeurs de retour
Retourne une description textuelle du contenu de l'argument filename ou FALSE si une erreur s'est produite.
Exemples
Exemple #1 Exemple avec finfo_file()
<?php
$finfo = finfo_open(FILEINFO_MIME); // Retourne le type mime à la extension mimetype
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
text/html image/gif application/vnd.ms-excel
finfo_file
darko at uvcms dot com
01-Aug-2008 08:28
01-Aug-2008 08:28
darko at uvcms dot com
24-Apr-2008 09:53
24-Apr-2008 09:53
Another interresting feature of finfo_file on Windows.
This function can return empty string instead of FALSE for some file types (ppt for example). Therefore to be sure do a triple check of output result and provide default type just in case. Here is a sample code:
$ftype = 'application/octet-stream';
$finfo = @finfo_open(FILEINFO_MIME);
if ($finfo !== FALSE) {
$fres = @finfo_file($finfo, $file);
if ( ($fres !== FALSE)
&& is_string($fres)
&& (strlen($fres)>0)) {
$ftype = $fres;
}
@finfo_close($finfo);
}
WebShowPro
25-Sep-2007 02:01
25-Sep-2007 02:01
Just an improvement on the sample Ryan Day posted - slightly off topic since this method does not use finfo_file but in some cases this method might be preferable.
The main change is the -format %m parameters given to the identify call. I would suggest using the full system path to identify i.e. /usr/bin/identify to be a little safer (the location may change from server to server though).
<?php
function is_jpg($fullpathtoimage){
if(file_exists($fullpathtoimage)){
exec("/usr/bin/identify -format %m $fullpathtoimage",$out);
//using system() echos STDOUT automatically
if(!empty($out)){
//identify returns an empty result to php
//if the file is not an image
if($out == 'JPEG'){
return true;
}
}
}
return false;
}
?>
spazdaq at hotmail dot com
21-Sep-2007 07:00
21-Sep-2007 07:00
FYI
contrary to the documentation, finfo_file seems to be returning a semicolon delimited string that contains not just the mime type but also the character set.
so
$finfo = finfo_open(FILEINFO_MIME);
echo(finfo_file($finfo, $my_file));
returns: text/plain; charset=us-ascii
it may be dependent on the magic file, but i'm too lazy to investigate further.
Ryan Day
31-Aug-2007 02:34
31-Aug-2007 02:34
to check images on unix based systems its much better to use the identify command provided by image magic as it provides accurate results about all files
<?php
function is_jpg($fullpathtoimage){
if(file_exists($fullpathtoimage)){
exec("identify $fullpathtoimage",$out);
//using system() echos STDOUT automatically
if(!empty($out)){
//identify returns an empty result to php
//if the file is not an image
$info = $out[0];
$info = explode(' ',$out[0]);
//^IF THE FILENAME CONTAINS SPACES
//^THIS WILL NOT WORK...be creative
$type = $info[1];
if($type == 'JPEG'){
return true;
}
}
}
return false;
}
?>
identify can process all types of images that are web friendly
sample output:
./image/someimage.jpg JPEG 150x112 150x112+0+0 DirectClass 8-bit 4.54688kb
if you dont want to control the image name or want to support spaces use: escapeshellarg()
http://us2.php.net/manual/en/function.escapeshellarg.php
function links:
exec() -- http://us2.php.net/manual/en/function.exec.php
explode() -- http://us2.php.net/manual/en/function.explode.php
Schraalhans Keukenmeester
21-May-2007 03:20
21-May-2007 03:20
Tempting as it may seem to use finfo_file() to validate uploaded image files (Check whether a supposed imagefile really contains an image), the results cannot be trusted. It's not that hard to wrap harmful executable code in a file identified as a GIF for instance.
A better & safer option is to check the result of:
if (!$img = @imagecreatefromgif($uploadedfilename)) {
trigger_error('Not a GIF image!',E_USER_WARNING);
// do necessary stuff
}
