SunshinePHP Developer Conference 2015

finfo_open

finfo::__construct

(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)

finfo_open -- finfo::__constructCrée une nouvelle ressource fileinfo

Description

Style procédural

resource finfo_open ([ int $options = FILEINFO_NONE [, string $magic_file = NULL ]] )

Style orienté objet (constructor):

public finfo::__construct ([ int $options = FILEINFO_NONE [, string $magic_file = NULL ]] )

Cette fonction ouvre une base de données magique et retourne sa ressource.

Liste de paramètres

options

Une ou une union de plusieurs constantes Fileinfo.

magic_file

Nom de fichier d'une base de données magique, normalement quelque chose comme /path/to/magic.mime. Si non spécifié, la variable d'environnement MAGIC est utilisée. Si la variable d'environnement n'est pas définie, la base de données magique embarquée à PHP sera utilisée.

Le fait de passer NULL ou une chaîne de caractères vide équivaut à utiliser la valeur par défaut.

Valeurs de retour

(Uniquement en mode procédural) Retourne une ressource de base de données magique en cas de succès ou FALSE si une erreur survient.

Notes

Avertissement

Le format de la base de données magique a changé en PHP 5.3.11 et 5.4.1. De ce fait, la base de données magique interne a été mise à jour. L'un des plus gros effets de cette mise à jour est que, lors d'une lecture d'un fichier magique ancien, elle échoue. De plus, quelques représentations textuelles de type mimes ont changé, par exemple, pour le monde de PHP "PHP script, ASCII text" est retourné au lieu de "PHP script text".

Note:

Généralement, l'utilisation de la base de données magique embarquée (en laissant les variables d'environnement magic_file et MAGIC non définies) est la meilleure des solutions à moins que vous n'ayez besoin d'une base de données magique spécifique.

Exemples

Exemple #1 Style orienté objet

<?php
$finfo 
= new finfo(FILEINFO_MIME"/usr/share/misc/magic"); // Retourne le type mime

/* Récupère le mime-type d'un fichier spécifique */
$filename "/usr/local/something.txt";
echo 
$finfo->file($filename);

?>

Exemple #2 Style procédural

<?php
$finfo 
finfo_open(FILEINFO_MIME"/usr/share/misc/magic"); // Retourne le type mime

if (!$finfo) {
    echo 
"Échec de l'ouverture de la base de données fileinfo";
    exit();
}

/* Récupère le mime-type d'un fichier spécifique */
$filename "/usr/local/something.txt";
echo 
finfo_file($finfo$filename);

/* Fermeture de la connexion */
finfo_close($finfo);
?>

L'exemple ci-dessus va afficher :

text/plain; charset=us-ascii

Voir aussi

add a note add a note

User Contributed Notes 10 notes

up
6
illusivefingers at gmail dot com
2 years ago
I am running Windows 7 with Apache.  It took hours to figure out why it was not working.

First, enable the php_fileinfo.dll extension in you php.ini. You'll also need the four magic files that are found in the following library:

http://sourceforge.net/projects/gnuwin32/files/file/4.23/file-4.23-bin.zip/download

An environment variable or a direct path to the file named "magic" is necessary, without any extension. 

Then, make sure that xdebug is either turned off or set the ini error_reporting to not display notices or warnings for the script.

Hope this saves someone a few hours of frustration!
up
3
mark at dynom dot nl
5 years ago
It seems there is quite some inconsistency in distributions and loading of magic files.

On Archlinux, the file is located here:
/usr/share/misc/file/magic.mgc

But this:

<?php
$fi
= new finfo(FILEINFO_MIME, '/usr/share/misc/file/magic');
$fi->file('/tmp/fubar.txt');
?>

Actually segfaults, where if I type the full name (including the file extension:)

<?php
$fi
= new finfo(FILEINFO_MIME, '/usr/share/misc/file/magic.mgc'); // added ".mgc"
$fi->file('/tmp/fubar.txt');
?>

It works as expected, so I guess something goes wrong with "A .mime and/or .mgc suffix is added if needed."
up
2
olivier dot berger at it-sudparis dot eu
3 years ago
On my Debian squeeze system, the path needed is like :
<?php
$finfo
= new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
up
2
ian at createanet dot co dot uk
6 years ago
Couldn't get finfo to return the mimetype in the way expected so i made a function to do it with system()

<?php
function get_mime_type($filepath) {
   
ob_start();
   
system("file -i -b {$filepath}");
   
$output = ob_get_clean();
   
$output = explode("; ",$output);
    if (
is_array($output) ) {
       
$output = $output[0];
    }
    return
$output;
}
?>

hope it works for other people too
up
1
Anonymous
1 year ago
For most common image files:
<?php
function minimime($fname) {
   
$fh=fopen($fname,'rb');
    if (
$fh) {
       
$bytes6=fread($fh,6);
       
fclose($fh);
        if (
$bytes6===false) return false;
        if (
substr($bytes6,0,3)=="\xff\xd8\xff") return 'image/jpeg';
        if (
$bytes6=="\x89PNG\x0d\x0a") return 'image/png';
        if (
$bytes6=="GIF87a" || $bytes6=="GIF89a") return 'image/gif';
        return
'application/octet-stream';
    }
    return
false;
}
?>
up
0
franssen dot roland at gmail dot com
4 years ago
Notice FileInfo::__construct() has strange behavior in PHP < 5.3.1 when a 2nd parameter is set explicitly, e.g.;

<?php
$fileInfo
= new finfo(FILEINFO_MIME, null);
?>

Expected result:
----------------
object(finfo)#2 (0) { }

Actual result:
--------------
Warning: finfo::finfo(): Failed to load magic database at ''. in *** on line ***
object(finfo)#2 (0) { }

See http://bugs.php.net/bug.php?id=51732
up
0
php at brudaswen dot de
6 years ago
Since it costed me some time to find the needed magic database files for Windows, just a hint:

The last release of the GnuWin32 project with both needed files (magic and magic.mime) currently was "file-4.23".
All releases after 4.23 to 4.25-1 did not contain both needed files.

Hope that helps.
up
0
dario dot borreguero at gmail dot com
6 years ago
Platform: WinXP-SP2, PHP5.2.5, MySQL 5.0, Apache 2.2.8

After reading former notes, I wasn't able to load my magic database: 'magic.mime' file (donwloaded from GnuWin32 project, zipped with the binary files v4.21). I always got an invalid $finfo object or finfo_open(...) returned FALSE.

In order to be able to load the 'magic.mime' file, Fileinfo library (bundled in PHP5.2.5) also requires 'magic' file.

For example:
1. Database:
  c:\php\magic.mime
  c:\php\magic

2. PHP Code:
<?php
  $filname
= 'c:\php\php.ini';
 
$finfo = new finfo(FILEINFO_MIME, 'c:\php\magic');
  if (!
$finfo) return false;
  echo
$finfo->file($filename);
?>

For further info see: http://pecl.php.net/bugs/bug.php?id=7555

Pay attention to comments added by 'christophe dot charron dot xul at gmail dot com'

NOTE: Before upgrading to PHP5.2.5, I was working with PHP5.2.1 and it only required 'magic.mime' file.
up
0
php at kingsquare dot nl
6 years ago
The current version (1.04) doesnt support a different mime.magic database than the server default.

(the documentation is thus not correct)
Ubuntu default location is '/usr/share/file/magic'. In order for the examples to work all finfo_open()-commands must be issued with the extra location accordingly:
<?php
$file
= "/path/to/file.jpg";
$handle = finfo_open(FILEINFO_MIME, '/usr/share/file/magic');
$mime_type = finfo_file($handle,$file);
?>
up
0
tularis at php dot net
7 years ago
On Windows systems people might find that this always returns "application/x-dpkg".
There are 2 ways of solving this problem:
1. Get the mime-magic database file from GnuWin32 at <http://sourceforge.net/projects/gnuwin32/>
2. You can manually "fix" the mime-magic file by editing it and escaping all lines starting with !, thus changing each one to \!
To Top