我有以下 PHP 代码,显示上传文件的 mime 类型。
<?php
if ($_POST) {
var_dump($_FILES);
$finfo = new finfo(FILEINFO_MIME_TYPE);
var_dump($finfo->file($_FILES['file']['tmp_name']));
} else{
?>
<form method="POST" enctype="multipart/form-data"><input name="file" type="file"><input name="submit" value="send" type="submit"/></form>
<?php
}
使用此脚本上传somefile.csv的结果如下。
array (size=1)
'file' =>
array (size=5)
'name' => string 'somefile.csv' (length=12)
'type' => string 'text/csv' (length=8)
'tmp_name' => string '/tmp/phpKiwqtu' (length=14)
'error' => int 0
'size' => int 3561
string 'text/x-fortran' (length=14)
所以当然 mime 类型应该是 text/csv。但我使用的框架(Symfony 1.4)使用带有fileinfo的方法。
我还进一步测试了该命令(在 Ubuntu 上)file --mime-type somefile.csv
回报somefile.csv: text/x-fortran
和命令mimetype somefile.csv
回报somefile.csv: text/csv
。 somefile.csv 是用 MSOffice 创建的(我不知道这是否重要)。
显然mimetype
使用一些很棒的 mime 数据库(http://freedesktop.org/wiki/Software/shared-mime-info), 尽管file
才不是。
- PHP 是否使用
file
or mimetype
或者两者都不是?
- 此外,我不知道在这里做什么;我上传的文件格式错误吗?我必须使用不同的 mime 数据库吗? PHP有bug吗?这里发生了什么?
edit:
我这里没有 Unix 盒子来检查真正的“魔法”文件(用于猜测 mime 类型的签名数据库),但快速的 Google 搜索揭示了这一点:
# $File: fortran,v 1.6 2009/09/19 16:28:09 christos Exp $
# FORTRAN source
0 regex/100 \^[Cc][\ \t] FORTRAN program
!:mime text/x-fortran
显然,它扫描文件的开头,查找以单个 C 字母加空格开头的行,这似乎是Fortran 风格的注释。因此误报:
somecolumn;
C F;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)