1

我在共享主机上,并且一直在与他们争夺文件信息的工作,我们终于让它工作了,但我又遇到了另一个障碍,我基本上得到了这个,因为我正在创建一个新的文件上传工具,我们需要知道正在上传哪些 mimetype,但 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检查文件,如果文件不是我们接受的文件将被丢弃,否则将被复制到公共文件,然后从临时文件夹中丢弃。

我已经创建了该进程,但 fileinfo 仍然不想合作并为所有内容返回 application/octet-stream,即使它们位于刚刚保存在 public_html 文件夹上方的服务器上。

有什么建议吗?

杰克

4

2 回答 2

3

建议

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

A. 上传文件时,它也会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);

C. 折旧

mime_content_type&都Fileinfo没有得到适当的维护,并且已经贬值。

更新:它曾经在手册中被错误地标记为已弃用,但它已在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 );

    }
}
于 2012-04-29T22:43:55.260 回答
2

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

尝试 :

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

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

finfo_close($finfo);
于 2012-04-29T22:28:53.473 回答