文件信息函数

目录

添加备注

用户贡献的备注 14 个备注

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());
?>
13
Paul
16 年前
这个函数的结果似乎质量很差。

例如
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 都正确识别了我的另外两个测试文件,它们是将 windows exe 重命名为 .doc 扩展名,以及将 PDF 重命名为 .doc 扩展名。
1
jon at cybus dot co dot uk
16 年前
为了让 v1.0.4 在我的 Ubuntu Feisty 系统上正常工作,我不得不执行以下操作。在 Debian 上可能也是一样的。

* apt-get install libmagic1-dev
* pecl install Fileinfo
* 将“extension=fileinfo.so”添加到 php.ini(/etc/php5/{cli,cgi}/php.ini)
* ln -s /usr/share/file/magic /etc/magic.mime
3
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
15 年前
针对“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 命令说 'Package "Fileinfo" is not valid,
install failed'。

然后 "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" 命令 :)

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

我希望,我能帮上忙。
-1
aidan at php dot net
17 年前
PHP Warning: finfo::finfo(): Failed to load magic database at '/etc/magic'
PHP Warning: finfo::file(): The invalid fileinfo object

这些错误可以通过将你的 magic 数据库(取决于你的发行版,这个文件可能在任何地方,在 debian 中它在 /usr/share/file/magic)复制到 /etc/magic.mime 来解决。

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

同样的问题也适用于
PHP Warning: finfo::finfo(): Failed to load magic database at '/etc/magic.mime'

不幸的是,在这种情况下,用户必须将 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 有助于显示问题所在

...
checking for fileinfo support... yes, shared
checking for magic files in default path... not found
configure: error: Please reinstall the libmagic distribution
<quit>

我认为这是因为缺少 magic 数据库,比如 magic.mime,但检查 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
13 年前
'Failed to load magic database at...'

此错误消息可能是由库和数据库之间的不兼容导致的。通过尝试使用 file 命令编译数据库来检查你的数据库,例如

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

b.
-4
nessi at nessi dot ch
14 年前
对于 opensuse,你只需要安装 file-devel 来解决使用以下命令的问题
checking for magic files in default path... not found
configure: error: Please reinstall the libmagic distribution

zypper install file-devel
-7
hari_1983 at yahoo dot com
16 年前
实际上,对于 RPM 用户来说,file-devel 包含了 libmagic 包含的所有内容。除了 pear 之外,你还可以直接使用 "pecl install Fileinfo"。
To Top