在PHP中,为什么imagecreatefromjpeg“不是jpeg文件”更改为致命错误?

时间:2017-03-19 23:55:35

标签: php gd fatal-error

我有一段较旧的代码尝试加载图片文件。由于它不知道它是什么类型,因此代码会尝试所有类型:

$res = @imagecreatefromjpeg($sourceName);
if ( $res === false)
    $res = @imagecreatefromgif($sourceName);
if ( $res === false)
    $res = @imagecreatefrompng($sourceName);
if ( $res === false) {
    $err[] = 'Cannot load file as JPEG, GIF or PNG!';

这曾经很长时间都能正常工作,但在最近的服务器迁移后,它在使用PNG文件时停止工作(JPEG文件工作正常)。调查显示,第一行产生致命错误:

  

致命错误:imagecreatefromjpeg():gd-jpeg:JPEG库报告不可恢复的错误:不是JPEG文件:以0x89 0x50开头

由于该行具有错误抑制运算符,因此脚本只是停止执行并返回带有空响应的HTTP 200。

我不明白的是......哇......怎么......为什么......从什么时候开始......嗯?

即使official documentation说这些函数在无法加载文件时返回FALSE,也会显示带有@运算符的构造。我在网上找不到任何可能会说“不是JPEG文件”是致命错误的内容。它提到的每个地方,都是一直以来的警告。为什么我现在会遇到致命错误?

我的PHP是5.6.30,GD就是一切。

2 个答案:

答案 0 :(得分:6)

我想我可以回答我自己的问题。这是一个已知的错误。看到。 PHP错误#73514#73479。实际上这个bug在libgd中,并且一直是reported there too。一个fix was made last November,但仍然没有发布。所以,是的......没有运气。我将尝试使用getimagesize()来确定类型,然后使用适当的函数。对于真正腐败的文件,这仍然无济于事,但它确实存在。

答案 1 :(得分:0)

问题是你的文件扩展名不好,根据第一个字节,它实际上是 PNG,而不是 JPG。我的解决方案是检测第一个字节并将文件重命名为 PNG:

$firstBytes = bin2hex(file_get_contents($tmp_name,false,null,0,2));
if ($firstBytes==8950) $_FILES['file']['name'].= '.png';