严重的fileinfo问题

时间:2012-04-29 22:17:31

标签: php mime fileinfo

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

因此,.sql文件将返回text / plain,正确。

但是,其他每个文件都只会返回application / octet-stream,我想知道为什么会出现这种情况,我不想惹恼主持人大量的问题所以我想得到一些研究关于这个问题,我先把它们弄得麻烦。

代码:

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语句会导致它返回application / octet-stream,这是不正确的。

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

我已创建了该进程,但仍然无法合作并返回application / octet-stream,即使它们位于刚刚保存在public_html文件夹上的服务器上。

有什么建议吗?

杰克

2 个答案:

答案 0 :(得分:3)

建议

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

一个。上传文件时,它还会在mime type

中自动返回$_FILES
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);

℃。折旧

mime_content_type& Fileinfo没有得到妥善维护,而且已经过折旧。

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

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

Getting mime type of zipped files

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类型...

电子。使用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 );

    }
}

答案 1 :(得分:2)

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

尝试:

$finfo = finfo_open(FILEINFO_MIME, "/usr/share/file/magic.mime");

if (!$finfo) {
    echo "Opening fileinfo database failed";
    exit();
}

finfo_close($finfo);