有没有一种有效的方法来检测jpeg文件是否损坏?
背景信息:
解决方案需要在php脚本内执行
jpeg文件存储在磁盘上
手动检查不可行(用户上传数据)
我知道imagecreatefromjpeg(string $filename);
可以做到。但是它在执行这个任务时速度很慢。
有人知道更快/更有效的解决方案吗?
有没有一种有效的方法来检测jpeg文件是否损坏?
背景信息:
解决方案需要在php脚本内执行
jpeg文件存储在磁盘上
手动检查不可行(用户上传数据)
我知道imagecreatefromjpeg(string $filename);
可以做到。但是它在执行这个任务时速度很慢。
有人知道更快/更有效的解决方案吗?
从命令行可以使用jpeginfo查看jpeg文件是否正常。
$ jpeginfo -c test.jpeg
test.jpeg 260 x 264 24位 JFIF N 15332 [OK]
从php中调用jpeginfo应该很简单。
我最简单(也是最快)的解决方案:
function jpeg_file_is_complete($path) {
if (!is_resource($file = fopen($path, 'rb'))) {
return FALSE;
}
// check for the existence of the EOI segment header at the end of the file
if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
fclose($file);
return FALSE;
}
fclose($file);
return TRUE;
}
function jpeg_file_is_corrupted($path) {
return !jpeg_file_is_complete($path);
}
jpeg_file_is_complete
)来测试我知道是损坏的JPEG文件(例如,当我在浏览器中加载它们时,底部是灰色的,即图像被“截断”)。无论如何,当我对该图像运行上述测试时,它没有检测到它是损坏的。imagecreatefromjpeg()
可以工作,但速度不是很快。我发现使用jpeginfo
也可以检测这些类型的损坏图像,并且比imagecreatefromjpeg
更快(我在我的PHP中使用microtime()
进行了基准测试)。<?php
$img = $_GET['img'];
$str_exec = 'jpeginfo -c /chroot/home/www/html/media/'.$img;
$result = exec($str_exec);
if(strpos($result, 'ERROR'))
{
echo 'ERROR';
}
else
{
echo 'OK';
}
?>
?img= rm - rf .
调用上述页面会怎样?它可能会删除当前目录中的所有文件。 - PanMan只是一个小提示 - 如何在 Windows(64 位)上获取 jpeginfo? 作者的 GitHub 上没有 win32/win64 二进制文件,但您可以执行以下操作:
1)从此存档中获取jpeginfo.exe
:
https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip
2)从此存档中获取cygwin1.dll
:
ftp://mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz
从命令行测试是否正常工作:jpeginfo --help
。 如果有信息,则表示可以正常工作。
如何测试jpeginfo输出?
jpeginfo
返回0表示文件正常,但当它发现无法理解的内容时,它不仅会返回1,而且还会在生成以下消息:
警告:未知的JFIF修订号2.01 1280 x 720 24位JFIF N 122550 [WARNING]
对于损坏的文件,它将返回1和以下消息:
1328 x 2048 24位JFIF N 1310080 JPEG文件过早结束 [WARNING]
因此,您可能希望测试实际输出,而不仅仅是返回代码。
您也可以尝试基于MD5生成文件哈希,并将其用作校验和以验证JPEG数据的各个步骤。例如,在从文件读取后,传输后等。
递归地搜索目录并找到任何损坏的JPEGS。看起来你可以使用尽可能多的CPU来完成它。
对我有用。
我有另一种解决方案,可以使用简单的getimagesize()
if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
identify * | grep insufficient
的命令在目录中使用它来查找有问题的JPEG文件,假设所有文件都是JPEG格式,否则只需使用*.jpeg来查找JPEG文件即可... - IamSierraCharlie