4

我有以下 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)使用文件信息的方法。

此外,我进一步测试了该命令(在 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没有。

  1. PHP 使用file还是mimetype不使用?
  2. 此外,我不确定在这里做什么;我上传的文件格式错误吗?我必须使用不同的 mime 数据库吗?PHP被窃听了吗?这里发生了什么?

编辑:

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

somecolumn;
C F;

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

4

2 回答 2

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 样式的注释。因此误报:

somecolumn;
C F;
于 2013-04-24T15:43:32.333 回答
0

来自PHP Mimetype 的介绍

此扩展已被弃用,因为 PECL 扩展 Fileinfo 以更简洁的方式提供了相同的功能(以及更多功能)。

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

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

来自PHP Fileinfo 的介绍

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

这是一个关于同一主题的一些答案的问题:Detecting MIME type in PHP

于 2013-04-24T11:47:17.597 回答