我有一段较旧的代码尝试加载图片文件。由于它不知道它是什么类型,因此代码会尝试所有类型:
$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就是一切。
答案 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';