严重的文件信息问题


Severe fileinfo issues

我在共享主机上,并且一直在与他们斗争以使fileinfo正常工作,我们终于可以正常工作,但是我再次遇到了另一个障碍,我基本上得到了这个,因为我正在创建一个新的文件上传工具,我们需要知道正在上传哪些mimetype,但是fileinfo不想打球。

因此,.sql文件将返回文本/纯文本,正确。

但是,所有其他文件将简单地返回应用程序/八位字节流,我想知道为什么会这样,我不想用大量问题惹恼主机,所以我想在我进一步麻烦他们之前对这个问题进行一些研究。

法典:

function get_mime($filename)
{
    $result = new finfo(FILEINFO_MIME_TYPE, "/usr/share/file/magic.mime"); 
    return $result->file($filename, FILEINFO_MIME_TYPE);
}
echo $user->get_mime($_FILES['file']['tmp_name'][$i]);

任何帮助将不胜感激,非常感谢

更新

所以我开始更新 MIMETYPE 检查的代码,并且我已经更新了代码以反映以下内容(对于函数(:

function get_mime($filename)
{
    $result = new finfo(FILEINFO_MIME_TYPE, "/usr/share/file/magic.mime"); // return mime type ala mimetype extension
    if (is_resource($result) === true)
    {
        return $result->file($filename, FILEINFO_MIME_TYPE);
    } else {
        return "failed";
    }
    return false;
}

显然,正如你所看到的,我已经让它输出失败了,当它失败时。这是 100% 的时间发生的,删除 if 语句会导致它返回应用程序/八位字节流,这是不正确的。

上传

过程将是:用户上传 -> 文件被移动到公共上方的临时文件夹,(upload_check(在那里它们将由 fileinfo 检查,如果文件不是我们接受的,它将被丢弃,否则它将被复制到公共文件,然后从临时文件夹中丢弃。

我已经创建了该过程,但 fileinfo 仍然不想合作并返回所有内容的应用程序/八位字节流,即使它们位于刚刚保存在 public_html 文件夹上方的服务器上。

有什么建议吗?

杰克

建议

我真的认为你在这里弄错了...

A. 上传文件时,它还会在$_FILES中自动返回mime type

echo $_FILES['file']['type'][$i] ;

B 如果要获取未上传文件的 mime,或者尝试更好地确定客户端标头提供的内容,请使用mime_content_type http://php.net/manual/en/function.mime-content-type.php

echo mime_content_type($fileName);

C. 折旧

mime_content_typeFileinfo都没有得到适当的维护,并且已经折旧。

更新:它曾经在手册中被错误地标记为已弃用,但已在 2016 年 1 月 14 日 https://bugs.php.net/bug.php?id=71367 修复。如您所见,支持7.0,因此根本没有停产。

或者,可以建议您查看以下链接进行更换

获取压缩文件的 MIME 类型

http://www.php.net/manual/en/function.mime-content-type.php#87856

D.您还可以使用getID3 http://sourceforge.net/projects/getid3/files/getID3%28%29%201.x/1.9.3/它可以检查某些常见文件的真实 mime 类型......

E. 使用 Linux 命令行可能会节省

$mime = shell_exec("file -bi " . escapeshellarg($file));   

或在 Mac 上

$mime = shell_exec("file -b --mime ".escapeshellarg($file));

最后

你为什么要直接处理$_FILES['file']['tmp_name'][$i]?众所周知,这会带来很多问题

尝试

$tempDir = ""; // Temp
foreach ( $_FILES ["file"] ["error"] as $key => $error ) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES ["file"] ["tmp_name"] [$key];
        $name = $_FILES ["file"] ["name"] [$key];
        $tempFile = "$tempDir/$name";
        move_uploaded_file ( $tmp_name, $tempFile );
        echo $user->get_mime ( $tempFile );
        unlink ( $tempFile );
    }
}

您应该检查您尝试使用的魔术文件是否存在并且可以由 php 读取。

尝试:

$finfo = finfo_open(FILEINFO_MIME, "/usr/share/file/magic.mime");
if (!$finfo) {
    echo "Opening fileinfo database failed";
    exit();
}
finfo_close($finfo);