PHP测试腐败(但显然很好)的图像

时间:2011-10-03 13:50:39

标签: php jpeg corrupt

我有一个使用SimpleImage.php的简单图像上传脚本 (http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/) 调整大小并保存上传图像的2份副本。

没有大量的验证,只是检查它是否存在,文件扩展名是否正常,以及exif_imagetype();调用。

到目前为止,这一直没有问题,直到我试图上传一个看似正常的jpeg,结果证明是无形的(并且无法测试?)腐败。有一些关于它的不对,但我对图像损坏知之甚少 - 它看起来很好并且在任何事情上都没有问题,但当我试图在我的脚本中保存缩放副本时,我得到了一个白页。

问题肯定是特定图像,我已经使用本地库存和库存图像网站中的其他图像进行了充分测试,只有一张图像打破了它。

我使用Photoshop重新调整了副本(预测文件大小的东西给了我一些奇怪的数字 - 最高质量的jpeg 45meg)并且没有任何问题上传。

所以我的问题是,我该如何测试呢?

有问题的图片在这里:http://chinawin.co.uk/broken.jpg //要小心,700k

注意:我已经测试了类似的分辨率,图像大小和名称,其他一切都与此图像分开。

更新: 通过反复试验,我缩小了脚本断开的位置,将图像加载到SimpleImage的var中。奇怪的是,这是第二行(第一行是创建大型副本,这是创建缩略图)。 评论它意味着其余的工作正常......也许一些重构会避免这个问题。

第二次更新: 这是一段代码和一些失败的上下文:

//check if our image is OK
if ($image && $imageThumb) 
{
    //check if image is a jpeg
    if (exif_imagetype($_FILES[$k]['tmp_name']) == IMAGETYPE_JPEG)
    {
        list($width, $height, $type, $attr) = getimagesize($_FILES[$k]['tmp_name']);
        //echo 1;
        $image = new SimpleImage(); 
        //echo 2;               
        $image->load($_FILES[$k]['tmp_name']);      
        //echo 3;
        $imageThumb = new SimpleImage();
        //echo 4;

        //this next line topples my script, but only for that one image - why?:
        $imageThumb->load($_FILES[$k]['tmp_name']);
        //echo '5<br/><br/>-------<br/>';
        //do stuff, save & update db, etc
    }
}

最终编辑: 事实证明我的脚本内存不足,并且有充分的理由 - 加载到内存中的4900x3900图像和240 ppi的图像大约是48兆像素,两次 - 所以我使用的可能是&gt; 90meg ram, per 图像。

向@Pekka致敬,发现了这一点。

重构脚本只加载一次图像,然后使用这个变量代替它的兄弟,修复了我的脚本。上传较大(2.5meg)图像仍有(不同)问题,但这是另一个问题。

1 个答案:

答案 0 :(得分:2)

这很可能是一个内存问题:你的JPG非常大(超过4000 x 4000像素),并且未压缩,确实会占用大约48兆字节的RAM。

激活错误报告以确保。如果是这个原因,请参阅例如这里做什么:Uploading images with PHP and hitting the script memory limit