mei*_*juh 4 php symfony-1.4 mime-types
我有以下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
}
Run Code Online (Sandbox Code Playgroud)
使用此脚本上传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)
Run Code Online (Sandbox Code Playgroud)
所以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没有.
file或不使用mimetype?编辑:
它被检测为fortran程序的原因是somefile.csv仅包含以下内容:
somecolumn;
C F;
Run Code Online (Sandbox Code Playgroud)
我相信CSV文件的上述内容是否有效?如果某个字段包含空格,则该字段不必放在引号内,对吧?
我这里没有一个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
Run Code Online (Sandbox Code Playgroud)
显然,它会扫描文件的开头,查找以单个C字母加空格开头的行,这些行似乎是Fortran样式注释.因此误报:
somecolumn;
C F;
Run Code Online (Sandbox Code Playgroud)