【发布时间】:2011-10-03 13:50:39
【问题描述】:
我有一个使用 SimpleImage.php 的简单图片上传脚本 (http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/) 调整大小并保存上传图像的 2 个副本。
没有大量的验证,只是检查它是否存在以及文件扩展名是否正常,还有一个exif_imagetype(); 调用。
到目前为止,这一直没有问题,直到我尝试上传一个看似正常的 jpeg,结果却是不可见的(并且无法测试?)损坏。它有一些不对劲的地方,但我对图像损坏知之甚少 - 它看起来很好并且在任何东西上都没有打开任何问题,但是当我尝试在我的脚本中保存一个缩放的副本时,我得到了一个白页。
问题肯定出在那个特定的图像上,我已经对来自本地库存和库存图像站点的其他图像进行了详尽的测试,只有一张图像破坏了它。
我使用 Photoshop 调整了副本的大小(预测的文件大小给了我一些奇怪的数字 - 45meg 用于高质量 jpeg)并且上传没有问题。
所以我的问题是,我该如何测试呢?
有问题的图片在这里:http://chinawin.co.uk/broken.jpg //注意,700k
注意:我用类似的分辨率、图像大小和名称进行了测试,除此图像外,其他一切都可以正常工作。
更新: 通过反复试验,我缩小了脚本中断的位置,将图像加载到 SimpleImage 的 var 中。奇怪的是,这是这样做的第二行(第一行是创建大副本,这一行是创建缩略图)。 注释掉它意味着其余的工作正常......也许一些重构可以避免这个问题。
第二次更新: 这是一段代码的 sn-p 和失败行中的一些上下文:
//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
}
}
最终编辑: 原来我的脚本内存不足,并且有充分的理由 - 240 ppi 的 4900x3900 图像在加载到内存时约为 48 meg,两次 - 所以我使用的内存可能 > 90meg,per em> 图像。
感谢@Pekka 发现这一点。
将脚本重构为只加载一次图像,然后使用这个变量而不是它的兄弟变量,修复了我的脚本。上传更大(2.5meg)图像时仍然存在(不同)问题,但这是另一个问题。
【问题讨论】: