我在共享主机上,并且一直在与他们争斗以使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文件夹上的服务器上。
有什么建议吗?
杰克
答案 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);