(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
finfo_open -- finfo::__construct — Create a new fileinfo resource
过程化风格
$options
= FILEINFO_NONE
[, string $magic_file
= NULL
]] )面向对象风格 (constructor):
$options
= FILEINFO_NONE
[, string $magic_file
= NULL
]] )This function opens a magic database and returns its resource.
options
One or disjunction of more Fileinfo constants.
magic_file
Name of a magic database file, usually something like /path/to/magic.mime. If not specified, the MAGIC environment variable is used. If the environment variable isn't set, then PHP's bundled magic database will be used.
Passing NULL
or an empty string will be equivalent to the default
value.
(Procedural style only)
Returns a magic database resource on success 或者在失败时返回 FALSE
.
The expected magic database format changed in PHP 5.3.11 and 5.4.1. Due to this, the internal magic database was upgraded. This mostly effects code where an external magic database is used: reading an older magic file will now fail. Also, some textual representations of the mime types has changed, for instance for PHP would be "PHP script, ASCII text" instead of "PHP script text" returned.
Note:
Generally, using the bundled magic database (by leaving
magic_file
and the MAGIC environment variables unset) is the best course of action unless you specifically need a custom magic database.
Example #1 面向对象风格
<?php
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); // return mime type ala mimetype extension
/* get mime-type for a specific file */
$filename = "/usr/local/something.txt";
echo $finfo->file($filename);
?>
Example #2 过程化风格
<?php
$finfo = finfo_open(FILEINFO_MIME, "/usr/share/misc/magic"); // return mime type ala mimetype extension
if (!$finfo) {
echo "Opening fileinfo database failed";
exit();
}
/* get mime-type for a specific file */
$filename = "/usr/local/something.txt";
echo finfo_file($finfo, $filename);
/* close connection */
finfo_close($finfo);
?>
以上例程会输出:
text/plain; charset=us-ascii
Anonymous (2013-07-04 19:41:50)
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;
}
?>
illusivefingers at gmail dot com (2012-02-06 00:53:36)
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!
olivier dot berger at it-sudparis dot eu (2011-03-09 12:02:24)
On my Debian squeeze system, the path needed is like :
<?php
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
franssen dot roland at gmail dot com (2010-05-11 00:23:30)
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
mark at dynom dot nl (2008-11-09 12:34:08)
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."
php at brudaswen dot de (2008-09-15 03:13:53)
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.
dario dot borreguero at gmail dot com (2008-04-16 03:15:42)
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.
php at kingsquare dot nl (2008-01-23 07:41:40)
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);
?>
ian at createanet dot co dot uk (2007-11-02 08:50:55)
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
tularis at php dot net (2007-05-06 12:55:55)
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 \!