确定文件是否是PHP中的图像的最佳方法是什么?

时间:2011-12-06 19:45:15

标签: php image file-upload

我有一个人们可以上传文件的服务器。问题是某些文件名被破坏(没有任何扩展名),所以我无法立即确定文件类型。这个问题是两部分:对于有文件名的文件,确定它是否是图像的最佳方法是什么? (只是一个很长的if / else if列表?)其次,对于没有扩展名的文件,我如何确定它们是否是图像?

12 个答案:

答案 0 :(得分:5)

您可以使用exif_imagetype()

<?php
    $type =exif_imagetype($image);

其中$ type是一个值

  1. IMAGETYPE_GIF
  2. IMAGETYPE_JPEG
  3. IMAGETYPE_PNG
  4. IMAGETYPE_SWF
  5. IMAGETYPE_PSD
  6. IMAGETYPE_BMP
  7. IMAGETYPE_TIFF_II(英特尔字节顺序)
  8. IMAGETYPE_TIFF_MM(摩托罗拉字节顺序)
  9. IMAGETYPE_JPC
  10. IMAGETYPE_JP2
  11. IMAGETYPE_JPX
  12. IMAGETYPE_JB2
  13. IMAGETYPE_SWC
  14. IMAGETYPE_IFF
  15. IMAGETYPE_WBMP
  16. IMAGETYPE_XBM
  17. IMAGETYPE_ICO
  18. 从手册:

    当找到正确的签名时,将返回适当的常量值,否则返回值为FALSE。返回值与getimagesize()在索引2中返回的值相同,但exif_imagetype()要快得多。

答案 1 :(得分:4)

您可以使用getimagesize 它不需要GD图像库,它返回有关图像类型的相同信息。 http://it2.php.net/manual/en/function.getimagesize.php

答案 2 :(得分:2)

如果你启用了GD2扩展,你可以使用它来加载文件作为图像,然后如果它返回无效你可以捕获错误并返回FALSE,否则返回TRUE。

答案 3 :(得分:2)

这里有两个选项,一个是简单的,预先构建有一些缺点,另一个是复杂的,需要数学。

PHP's fileinfo可用于根据文件的实际标头信息检测文件类型。例如,我抓住你的重力:

enter image description here

但实际的代码是:

‰PNG


IHDR  szzô
IDATX…­—OL\UÆZÀhëT)¡    c•1T:1‘Š‘.Ú(]4†A“ÒEY˜à.................................

所以,即使没有文件名,我也能很清楚地发现它。这就是PHP Fileinfo扩展的功能。大多数PNG和JPG文件往往都有这个标题,但对于每种文件类型都不是这样。

话虽如此,从手册中可以看出fileinfo很简单:

$fi = new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));

你的另一个选择更复杂,这取决于你个人的野心,你可以generate a histogram and profile files based on their content

这样的内容看起来就像一个GIF文件:

enter image description here

这样的东西看起来就像一个TIFF文件:

enter image description here

从那里你需要为多种类型的文件生成一个模型,以获得每种类型的直方图,然后用它来猜测。这是一个很好的方法,用于那些没有真正具有可以轻松阅读的“魔术标题”的文件。请记住,您需要学习一些数学以及如何建模平均直方图函数并将它们与文件匹配。

答案 4 :(得分:1)

您可以尝试将图像加载到PHP的GD库中,看看它是否有效。

$file = file_get_contents('file');
$img = imagecreatefromstring($file);
if($img === FALSE){
  // file is NOT an image
}
else{
  // file IS an image
}

答案 5 :(得分:1)

看图像魔法识别。 http://www.imagemagick.org/script/identify.php

php包装器在这里:http://www.php.net/manual/en/function.imagick-identifyimage.php

或者,如果您只想验证它是图像(并且不关心元数据):http://www.php.net/manual/en/function.imagick-valid.php

答案 6 :(得分:1)

exif_imagetype()可能有用

确保您已启用exif。

答案 7 :(得分:0)

您可以使用Fileinfo扩展程序: http://www.php.net/manual/en/function.finfo-file.php

finfo_file()使用魔术字节,不必将整个图像加载到内存中。结果是具有相应MIME类型的字符串,例如:

  • text / html的
  • 图像/ GIF
  • application / vnd.ms-excel

答案 8 :(得分:0)

尝试查看exif_imagetype

答案 9 :(得分:0)

如果您需要快速解决方案,请使用imagesx()和imagesy()。通过从文件头中读取少量数据,还可以快速检查大图像文件的尺寸。在以下网址中详细说明:

http://hungred.com/useful-information/php-fastest-image-width-height/

答案 10 :(得分:0)

图像的类型通常可以从文件的标题信息中推断出来。

答案 11 :(得分:-1)

第一个问题是扩展已知您可以使用PHP函数in_array() Documentation