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!
finfo_open
finfo::__construct
(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
finfo_open -- finfo::__construct — Crée une nouvelle ressource fileinfo
Description
Style procédural
$options = FILEINFO_NONE
[, string $magic_file = NULL
]] )Style orienté objet (constructor):
$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 cette variable n'est pas fixée non plus, /usr/share/misc/magic est utilisé. L'extension .mime et/ou .mgc est ajoutée si approprié.
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
Depuis PHP >= 5.3.11 et >= 5.4.1, le format de la base de données magique a changé. A cause de cela, le mime interne de la base de données a évolué. Ceci affecte tout spécialement le code où la magie externe y est lue. Le fait de lire des fichiers magiques à l'ancien format ne fonctionne plus. De plus, la représentation textuelle de certains types mime a changé ; par exemple, pour PHP, c'est maintenant "PHP script, ASCII text" au lieu de "PHP script text".
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
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."
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
On my Debian squeeze system, the path needed is like :
<?php
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
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
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.
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.
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);
?>
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 \!
