我在共享主机上,并且一直在与他们斗争以使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_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 );
}
}
您应该检查您尝试使用的魔术文件是否存在并且可以由 php 读取。
尝试:
$finfo = finfo_open(FILEINFO_MIME, "/usr/share/file/magic.mime");
if (!$finfo) {
echo "Opening fileinfo database failed";
exit();
}
finfo_close($finfo);