finfo_open

finfo::__construct

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

finfo_open -- finfo::__construct创建新的 finfo 实例

描述

过程式风格

finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): finfo|false

面向对象风格(构造函数)

public finfo::__construct(int $flags = FILEINFO_NONE, ?string $magic_database = null)

此函数打开一个 magic 数据库并返回其实例。

参数

flags

一个或多个 Fileinfo 常量 的析取。

magic_database

magic 数据库文件的文件名,通常类似于 /path/to/magic.mime。如果未指定,则使用 MAGIC 环境变量。如果环境变量未设置,则使用 PHP 的捆绑 magic 数据库。

传递 null 或空字符串将等同于默认值。

返回值

(仅过程式风格) 成功时返回一个 finfo 实例,失败时返回 false

变更日志

版本 描述
8.1.0 现在返回一个 finfo 实例;以前返回一个 资源
8.0.3 magic_database 现在可以为 null。

示例

示例 #1 面向对象风格

<?php
$finfo
= new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); // 返回 mime 类型,类似 mimetype 扩展

/* 获取特定文件的 mime 类型 */
$filename = "/usr/local/something.txt";
echo
$finfo->file($filename);

?>

示例 #2 过程式风格

<?php
$finfo
= finfo_open(FILEINFO_MIME, "/usr/share/misc/magic"); // 返回 mime 类型,类似 mimetype 扩展

if (!$finfo) {
echo
"打开 fileinfo 数据库失败";
exit();
}

/* 获取特定文件的 mime 类型 */
$filename = "/usr/local/something.txt";
echo
finfo_file($finfo, $filename);

/* 关闭连接 */
finfo_close($finfo);
?>

以上示例将输出

text/plain; charset=us-ascii

注释

注意:

通常,除非您特别需要自定义 magic 数据库,否则使用捆绑的 magic 数据库(通过将 magic_databaseMAGIC 环境变量保持未设置状态)是最佳做法。

参见

添加注释

用户贡献的注释 10 条注释

dario dot borreguero at gmail dot com
16 年前
平台:WinXP-SP2, PHP5.2.5, MySQL 5.0, Apache 2.2.8

在阅读了以前的注释后,我无法加载我的 magic 数据库:'magic.mime' 文件(从 GnuWin32 项目下载,与二进制文件 v4.21 一起压缩)。我总是得到一个无效的 $finfo 对象,或者 finfo_open(...) 返回 FALSE。

为了能够加载 'magic.mime' 文件,Fileinfo 库(捆绑在 PHP5.2.5 中)还需要 'magic' 文件。

例如
1. 数据库
c:\php\magic.mime
c:\php\magic

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

有关更多信息,请参见:http://pecl.php.net/bugs/bug.php?id=7555

请注意 'christophe dot charron dot xul at gmail dot com' 添加的注释

注意:在升级到 PHP5.2.5 之前,我使用的是 PHP5.2.1,它只需要 'magic.mime' 文件。
illusivefingers at gmail dot com
12 年前
我使用的是 Windows 7 和 Apache。花了好几个小时才弄清楚为什么它不工作。

首先,在您的 php.ini 中启用 php_fileinfo.dll 扩展。您还需要四个 magic 文件,这些文件可以在以下库中找到

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

需要一个环境变量或指向名为 "magic" 的文件的直接路径,不带任何扩展名。

然后,确保 xdebug 已关闭或将 ini error_reporting 设置为不显示脚本的通知或警告。

希望这能帮您节省几个小时的沮丧时间!
匿名
11 年前
对于大多数常见图像文件
<?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;
}
?>
olivier dot berger at it-sudparis dot eu
13 年前
在我的 Debian squeeze 系统上,所需的路径类似于
<?php
$finfo
= new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
php at brudaswen dot de
15 年前
因为我在 Windows 上找到所需的 magic 数据库文件花了一些时间,所以提示一下

当前包含这两个所需文件(magic 和 magic.mime)的 GnuWin32 项目的最新版本是“file-4.23”。
从 4.23 到 4.25-1 的所有版本都没有包含这两个所需文件。

希望这有帮助。
php at kingsquare dot nl
16 年前
当前版本(1.04)不支持与服务器默认不同的 mime.magic 数据库。

(因此文档不正确)
Ubuntu 默认位置是 '/usr/share/file/magic'。为了使示例正常工作,所有 finfo_open() 命令都必须相应地发出额外的位置
<?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
16 年前
无法让 finfo 以预期的方式返回 mimetype,所以我创建了一个函数来用 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;
}
?>

希望它对其他人也有用
mark at dynom dot nl
15 年前
看来发行版和 magic 文件的加载存在相当多的不一致。

在 Archlinux 上,该文件位于这里
/usr/share/misc/file/magic.mgc

但是这个

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

实际上会导致段错误,如果我输入完整名称(包括文件扩展名):

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

它按预期工作,所以我想“如果需要,将添加 .mime 和/或 .mgc 后缀”出现了一些问题。
tularis at php dot net
17 年前
在 Windows 系统上,人们可能会发现这始终返回“application/x-dpkg”。
有两种方法可以解决此问题
1. 从 GnuWin32 获取 mime-magic 数据库文件,地址为 <http://sourceforge.net/projects/gnuwin32/>
2. 可以通过编辑 mime-magic 文件并转义以“!”开头的所有行来手动“修复”它,从而将每个行更改为“\!”
franssen dot roland at gmail dot com
14 年前
请注意,当显式设置第二个参数时,FileInfo::__construct() 在 PHP < 5.3.1 中存在奇怪的行为,例如;

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

预期结果
----------------
object(finfo)#2 (0) { }

实际结果
--------------
警告:finfo::finfo():无法在 *** 上的第 *** 行加载 magic 数据库“”。
object(finfo)#2 (0) { }

请参阅 http://bugs.php.net/bug.php?id=51732
To Top