PHP 大会日本 2024

Fileinfo 函数

目录

添加注释

用户贡献的注释 13 条注释

14
Paul
17 年前
此函数的结果似乎质量存疑。

例如
1) Word 文档返回
'application/msword application/msword'
...好吧,还不错,但为什么它会返回两次?

2) PHP 文件返回为
'text/x-c++; charset=us-ascii'
我的测试文件以 '<?php' 开头,所以并不模糊。它从哪里得到字符集假设?

3) 以字母 'GIF' 开头的文本文档返回为
'image/gif'
(就像 DanielWalker 为 unix 'file' 命令提供的示例一样)

我使用 PEAR 的 'MIME_Type' 包获得了更好的结果。它对 1 和 3 给出了正确的答案,并将 PHP 文件识别为 'text/plain',这可能比与 C++ 的错误匹配更好

finfo_file 和 MIME_Type 都正确识别了我的另外两个测试文件,它们分别是重命名为 .doc 扩展名的 Windows 可执行文件和重命名为 .doc 扩展名的 PDF 文件。
8
ccbsschucko at gmail dot com
6 年前

<?php
class FileInfoTool {

/**
* @var str => $file = 文件路径 (绝对或相对)
* @var arr => $file_info = 包含获取到的文件信息的数组
*/
private $file;
private
$file_info;

/**
* @param str => $file = 文件路径 (绝对或相对)
*/
public function get_file(string $file){
clearstatcache();
$file = str_replace(array('/', '\\'), array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
if(!
is_file($file) && !is_executable($file) && !is_readable($file)){
throw new
\Exception('未找到指定的文件!');
}
$this->file = $file;
$this->set_file_info($this->file);
return
$this;
}

/**
* @param str => $index = 如果指定索引,则返回文件的特定信息
*/
public function get_info($index = ''){
if(
$this->get_file_is_called()){
if(
$index === ''){
return
$this->file_info;
}
if(
$index != ''){
if(!
array_key_exists($index, $this->file_info)){
throw new
\Exception('未找到请求的信息!');
}
return
$this->file_info;
}
}
}

/**
* @todo 检查是否使用了 get_file() 方法来指定文件路径
*/
private function get_file_is_called(){
if(!
$this->file){
throw new
\Exception('未提供任何文件进行分析。请使用 get_file() 方法!');
return
false;
}
return
true;
}

/**
* @todo 使用文件信息填充数组
*/
private function set_file_info(){
$this->file_info = array();
$pathinfo = pathinfo($this->file);
$stat = stat($this->file);
$this->file_info['realpath'] = realpath($this->file);
$this->file_info['dirname'] = $pathinfo['dirname'];
$this->file_info['basename'] = $pathinfo['basename'];
$this->file_info['filename'] = $pathinfo['filename'];
$this->file_info['extension'] = $pathinfo['extension'];
$this->file_info['mime'] = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $this->file);
$this->file_info['encoding'] = finfo_file(finfo_open(FILEINFO_MIME_ENCODING), $this->file);
$this->file_info['size'] = $stat[7];
$this->file_info['size_string'] = $this->format_bytes($stat[7]);
$this->file_info['atime'] = $stat[8];
$this->file_info['mtime'] = $stat[9];
$this->file_info['permission'] = substr(sprintf('%o', fileperms($this->file)), -4);
$this->file_info['fileowner'] = getenv('USERNAME');
}

/**
* @param int => $size = 要格式化的字节数
*/
private function format_bytes(int $size){
$base = log($size, 1024);
$suffixes = array('', 'KB', 'MB', 'GB', 'TB');
return
round(pow(1024, $base-floor($base)), 2).''.$suffixes[floor($base)];
}
}

var_dump((new FileInfoTool)->get_file('sitemap.xml')->get_info());
?>
2
jon at cybus dot co dot uk
17 年前
为了使 v1.0.4 在我的 Ubuntu Feisty 系统上工作,我做了以下操作。在 Debian 上可能也一样。

* apt-get install libmagic1-dev
* pecl install Fileinfo
* 在 php.ini (/etc/php5/{cli,cgi}/php.ini) 中添加 "extension=fileinfo.so"
* ln -s /usr/share/file/magic /etc/magic.mime
4
Terren Suydam
16 年前
如果 finfo_file() 返回的 MIME 类型也包含字符集定义(用分号分隔),例如

text/plain; charset=us-ascii

那么你可能希望在 MIME 类型中保留字符集定义,尤其是在 HTTP Content-Length 标头中使用结果字符串时。HTTP 标准明确允许这样做,请参阅

http://www.w3.org/International/O-HTTP-charset

似乎一些之前的评论者试图删除字符集。
0
Evermorian
16 年前
针对下面“jon at cybus”建议将 /usr/share/file/magic 符号链接到 /etc/magic.mime,请注意,这会导致其他问题(至少在 Debian Etch 中是这样)。它会破坏 file 命令的 -i 功能,导致它返回人类可读的字符串而不是 MIME 类型。finfo 也会出现同样的问题。



因此,在实例化 finfo 对象时,最好实际正确指定 magic 文件的路径。

<?php
$fi
= new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));
?>

当然,您最终仍然会得到无法区分 Word 文档和 Excel 电子表格的东西。
0
szotsaki at gmail dot com
17 年前
我即将写下如何安装此软件包。

首先,我尝试使用“pear install fileinfo” - 正如手册中所述。
但是 pear 命令说“软件包“Fileinfo”无效,
安装失败”。

然后“pear install pecl/fileinfo”是一个更好的方法。但当时“phpize”命令丢失了。
我安装了它(在 openSUSE 发行版中它位于 php5-devel 中,但我认为您可以在您发行版的相应 php-devel 软件包中找到它)。

之后您可以安装“re2c”(我已安装)。其主页是:http://sourceforge.net/projects/re2c

将 Apache 的 magic 文件(通常位于 /etc/apache2 中)复制到以下目录:/usr/locale/share/file/ 或 /usr/share/file/。

然后您必须安装“libmagic-dev”。如果您有基于 Debian 的系统,您可以使用 apt 简单地安装它。
但是如果您有基于 rpm 的系统(像我一样),您必须下载以下软件包:http://packages.debian.org/unstable/libdevel/libmagic-dev
它包含我们需要的文件。
因此,下载文件,使用 Midnight Commander (mc) 浏览它(您必须安装 apt 和 dpkg),然后简单地提取(因此复制) .deb 包的 /usr 文件夹(它位于 CONTENTS 文件夹内)到根文件夹。

现在再次尝试“pear install pecl/fileinfo”命令 :)

附注:不要忘记检查脚本是否已将以下行写入 php.ini(在 openSUSE 上:/etc/php5/apache2):extension=fileinfo.so

我希望,我能提供帮助。
-1
aidan at php dot net
17 年前
PHP Warning: finfo::finfo(): 无法加载 /etc/magic 中的 magic 数据库
PHP Warning: finfo::file(): 无效的 fileinfo 对象

可以通过将您的 magic 数据库(根据您的发行版,此文件可能位于任何位置,在 Debian 上位于 /usr/share/file/magic)复制到 /etc/magic.mime 来纠正这些错误。

libmagic 自动将 .mime 附加到文件名末尾,因此 PHP 错误地报告了它正在查找的路径。

同样适用于
PHP Warning: finfo::finfo(): 无法加载 /etc/magic.mime 中的 magic 数据库

不幸的是,在这种情况下,用户必须将 magic 文件称为 /etc/magic.mime.mime。
-1
jausions at php dot net
18 年前
适用于 Windows 用户

1. 访问 http://pecl4win.php.net/ 获取 php_fileinfo.dll,如果您的 PHP 安装没有自带它,并且您还没有安装 Extensions 软件包。

2. 然后确保您的 php.ini 中某处有 extension=php_fileinfo.dll

3. 重启您的 Web 服务器。
-3
aidan at php dot net
15 年前
从 PHP 5.3 开始,Fileinfo 与主发行版一起提供并默认启用。此扩展程序不再在 PECL 中维护。
-2
motin at demomusic dot nu
17 年前
我尝试通过 pear/pecl 安装此软件包时遇到了真正的麻烦。遇到了看起来像这个错误的东西:http://pecl.php.net/bugs/bug.php?id=7673(phpize 失败)

我发现手动下载软件包并运行 ./configure 有助于显示问题所在

...
检查 fileinfo 支持... 是的,共享
检查默认路径中的 magic 文件... 未找到
configure: error: 请重新安装 libmagic 发行版
<退出>

我认为这是由于缺少像 magic.mime 这样的 magic-database 造成的,但检查 configure 脚本时,会搜索 magic.h。

我的问题是找不到 include/magic.h。在谷歌搜索在哪里可以找到 magic.h 后,我找到了
简单的解决方案

apt-get install libmagic-dev

奇怪的是,这并没有解决原始的安装错误,但允许手动安装

1. 从 http://pecl.php.net/package/Fileinfo 找到 fileinfo 的最新版本的 URL(目前:http://pecl.php.net/get/Fileinfo-1.0.4.tgz

2. 下载、编译和安装
wget http://pecl.php.net/get/Fileinfo-1.0.4.tgz
gunzip Fileinfo-1.0.4.tgz
tar -xvf Fileinfo-1.0.4.tar
cd fileinfo-1.0.4
./configure
make
make install

3. 在您的 php.ini 文件中添加 extension=fileinfo.so

4. 重启 Apache
-4
Alexey
17 年前
好吧,这个扩展很难安装和使用。有一个更好的替代方案 - 使用 lunux 命令“file”。有关说明 - 来自 linux shell 的“man file”。

<?
echo system("file -i -b file.pdf");
?>

application/pdf
-2
bostjan at a2o dot si
14 年前
“无法加载... 处的 magic 数据库”

此错误消息可能是由库和数据库之间的不兼容性引起的。尝试使用 file 命令编译数据库来检查您的数据库,如下所示

cd /etc/magic
file -C -m magic
file -C -m magic.mime

b。
-4
nessi at nessi dot ch
14 年前
对于 opensuse,您只需要安装 file-devel 来解决与
检查默认路径中的 magic 文件... 未找到
configure: error: 请重新安装 libmagic 发行版

zypper install file-devel
To Top