在php中检测mime类型失败

时间:2013-04-24 11:34:51

标签: 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
}

使用此脚本上传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却没有。{/ p>

  1. PHP是使用file还是mimetype还是不使用?
  2. 此外,我不知道该怎么做;我上传的文件是否格式错误?我是否必须使用不同的mime数据库? PHP被窃听了吗?这是怎么回事?
  3. 修改

    将其检测为fortran程序的原因是somefile.csv仅包含以下内容:

    somecolumn;
    C F;
    

    我相信CSV文件的上述内容是否有效?如果某个字段包含空格,则该字段不必放在引号内,对吗?

2 个答案:

答案 0 :(得分:6)

我这里没有Unix盒来检查一个真正的“魔法”文件(用于猜测mime类型的签名数据库),但谷歌的快速搜索显示了这一点:

# $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 style comment。因此误报:

somecolumn;
C F;

答案 1 :(得分:0)

来自PHP Mimetype introduction

  

此扩展程序已弃用,因为PECL扩展名Fileinfo以更清晰的方式提供相同的功能(及更多)。

     

此模块中的函数尝试通过查找文件中特定位置的某些魔术字节序列来猜测文件的内容类型和编码。虽然这不是一种防弹方法,但使用的启发式方法做得非常好。

     

此扩展源自Apache mod_mime_magic,它本身基于Ian F. Darwin维护的文件命令。有关更多历史和版权信息,请参阅源代码。

来自PHP Fileinfo introduction

  

此模块中的函数尝试通过查找文件中特定位置的某些魔术字节序列来猜测文件的内容类型和编码。 虽然这不是一种防弹方法,但使用的启发式方法做得很好

以下是对同一主题的一些答案的问题:Detecting MIME type in PHP