这不是一个真正的错误,但确定它不是你所期望的。 我有这个示例代码来上传图片:
if($type=="image/jpg" || $type=="image/jpeg" || $type=="image/pjpeg" || $type=="image/tiff" || $type=="image/gif" || $type=="image/png") {
// make upload
else echo "Incorrect format ....";
问题在于,如果我修改图像的扩展名,让我们说.jpgq甚至.jpg%,我尝试上传它,FF和Chrome会说文件的类型是“application / octet-流“并且通常条件将是假的。
另一方面,IE会说文件的类型是“image / jpeg”,条件为true,文件将被上传。当然,任何试图稍后阅读图像的浏览器都无法这样做。这不是一个错误,因为在msdn.microsoft.com上它说:“如果”建议“(服务器提供的)MIME类型未知(未知且不含糊),FindMimeFromData会立即返回此MIME类型”和“如果服务器提供的MIME类型已知或不明确,则会扫描缓冲区以尝试验证或从实际内容中获取MIME类型。”
我的问题是:
答案 0 :(得分:4)
忘记检查mime类型。请改用getimagesize()。
答案 1 :(得分:0)
出于性能原因,您的网络服务器通常不会检查文件的mimetype,它通常只使用扩展名。
因此,在上传时,您需要阅读mimetype,然后如果您希望网络服务器直接提供文件,则使用适合mimetype的扩展名保存文件。另一种方法是使用下载包装器从文件中读取mimetype并将其传递到客户端。
基本示例,
/* verify and sanitize any file extension from mimetype
*/
switch($subtype) {
case 'pjpeg':
case 'jpeg':
if (!preg_match('/\.jp(e)?g$/i', $real_name)) {
$real_name .= '.jpg';
}
break;
default:
if (!preg_match('/\.'.$subtype.'$/i', $real_name)) {
$real_name .= ".$subtype";
}
break;
}