PHP Conference Japan 2024

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)

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

参数

flags

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

magic_database

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

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

返回值

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

变更日志

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

示例

示例 #1 面向对象风格

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

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

?>

示例 #2 过程式风格

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

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_databaseMAGIC 环境变量保持未设置)是最佳做法。

参见

添加注释

用户贡献的注释 9 条注释

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 设置为不显示脚本的通知或警告。

希望这能为某些人节省几个小时的烦恼!
dario dot borreguero at gmail dot com
16 年前
平台:WinXP-SP2、PHP5.2.5、MySQL 5.0、Apache 2.2.8

在阅读了以前的注释后,我无法加载我的魔数数据库:“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”文件。
匿名
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
16 年前
由于我在 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
17年前
无法使 finfo 以预期的方式返回 mime 类型,因此我创建了一个使用 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
16 年前
发行版和 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 文件并转义所有以 ! 开头的行来手动“修复”它,从而将每个行更改为 \!
To Top