我有一段较旧的代码试图加载一个图像文件。由于它不知道它是哪种类型,所以代码会全部测试它们:
$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文件:从0x890x50开始
由于该行具有错误抑制操作符,脚本只需停止执行并返回带有空响应的HTTP 200。
我不明白的是..。啊..。怎么..。为什么..。从什么时候开始..。哈?
甚至正式文件也表示,这些函数在无法加载文件时返回FALSE
,其中也显示了带有@
运算符的构造。我在网上什么也找不到,说“不是JPEG文件”是一个致命的错误。无论什么地方都提到,这是一个警告,因为它一直是。为什么我现在会犯致命的错误?
我的PHP是5.6.30,GD和所有东西都在一起。
发布于 2017-03-20 08:55:54
我想我可以回答我自己的问题。是已知的窃听器。看见。PHP #73514和#73479。实际上,bug在libgd中,并且一直是那里也有报道。一个修复于去年11月。,但还没有发布。所以,是的..。没有运气。我将尝试使用getimagesize()
来首先确定类型,然后使用适当的函数。对于一个真正被破坏的文件来说,这仍然是没有帮助的,但这是有意义的。
发布于 2021-05-12 11:02:41
问题是yout文件的扩展名很差,基于第一个字节,它实际上是PNG,而不是JPG。我的解决方案是检测第一个字节并将文件重命名为PNG:
$firstBytes = bin2hex(file_get_contents($tmp_name,false,null,0,2));
if ($firstBytes==8950) $_FILES['file']['name'].= '.png';
https://stackoverflow.com/questions/42893841
复制相似问题