如何检查上传的文件是否为没有MIME类型的图像?

我想检查一个上传的文件是否是一个图像文件(如PNG,JPG,JPEG,GIF,BMP)或其他文件。 问题是我正在使用Uploadify上传文件,这些文件会更改MIME类型,并给出“文本/八进制”或其他类型的MIME类型,无论您上传的是哪种文件类型。

有没有办法检查上传的文件是否是一个图像,除了使用PHP检查文件扩展名?


你可以使用getimagesize() ,它在非图像上返回零大小。


我对这个主题的想法很简单:所有上传的图像都是邪恶的。

不仅因为它们可以包含恶意代码,而且特别是因为元标记。 我了解使用隐藏元标记浏览网页以找到一些受保护图像的抓取工具,然后播放其版权。 也许有点偏执狂,但由于用户上传的图片在版权问题上失控,我谨慎考虑。

为了摆脱这些问题,我使用gd系统地将所有上传的图像转换为png。 这有很多优点:图像清晰,最终的恶意代码和元标记,我只有一种格式的所有上传的图像,我可以调整图像大小,以符合我的标准,... 我立即知道图像是否有效! 如果图像无法打开进行转换(使用不关心图像格式的imagecreatefromstring),那么我认为图像无效。

一个简单的实现可能如下所示:

function imageUploaded($source, $target)
{
   // check for image size (see @DaveRandom's comment)
   $size = getimagesize($source);
   if ($size === false) {
      throw new Exception("{$source}: Invalid image.");
   }
   if ($size[0] > 2000 || $size[1] > 2000) {
      throw new Exception("{$source}: Too large.");
   }

   // loads it and convert it to png
   $sourceImg = @imagecreatefromstring(@file_get_contents($source));
   if ($sourceImg === false) {
      throw new Exception("{$source}: Invalid image.");
   }
   $width = imagesx($sourceImg);
   $height = imagesy($sourceImg);
   $targetImg = imagecreatetruecolor($width, $height);
   imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
   imagedestroy($sourceImg);
   imagepng($targetImg, $target);
   imagedestroy($targetImg);
}

测试它:

header('Content-type: image/png');
imageUploaded('http://www.dogsdata.com/wp-content/uploads/2012/03/Companion-Yellow-dog.jpg', 'php://output');

这并不完全回答你的问题,因为这与接受的答案相同,但我给你我的理由使用它,至少:-)


您可以通过检查文件开头的幻数来验证图像类型。

例如:每个JPEG文件都以“FF D8 FF E0”块开始。

这里是关于魔术数字的更多信息

链接地址: http://www.djcxy.com/p/46683.html

上一篇: How to check if an uploaded file is an image without mime type?

下一篇: I've tried application/pdf....How to upload pdfs?