【发布时间】:2011-07-10 23:07:38
【问题描述】:
我们有一个使用 Andrew Valums ajax 文件上传器的网络应用程序,如果我们一次启动 5 到 10 个图像上传,那么通常至少 2 或 3 个不会导致相同的 gd 错误“损坏 JPEG 数据”
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]:
gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data:
47 extraneous bytes before marker 0xd9 in ....
然而,这并没有在我们的旧测试服务器或本地开发服务器上发生,而是在我们的新生产服务器上发生。
服务器上的文件大小与我本地机器上的原始文件大小相同,因此它完成了上传,但我认为数据被服务器损坏了。
我可以“修复”损坏的文件,方法是删除它们并重新上传,或者通过 FTP 手动上传
我们在 Godaddy 上有一个共享主机,刚刚开始在一个新机器上遇到这个问题(我设置了这个问题,所以可能解释了很多 :) CentOS 5.5+、Apache 2.2.3、PHP 5.2.10
您可以在这里看到一些好的和坏的图片示例。 http://174.127.115.220/temp/pics.zip
当我对它们进行 BinDiffed 时,我看到一个一致的模式,损坏总是 64 字节块,虽然损坏块之间的距离不是恒定的,但数字 4356 出现了很多。
我真的认为我们可以排除 Internet,因为使用 TCP 进行错误检查和重新传输非常可靠,而且浏览器版本之间似乎没有区别,或者我是否关闭了防病毒和防火墙。
所以我要选择 Apache / PHP 的配置?
【问题讨论】:
-
我在这里可能帮不了你,但这是个好问题。干得好。
-
这可能不是一个解决方案,但您是否尝试过不同的网络服务器?总是有
nginx和lighttpd。 -
是的,我确信不同的服务器会解决这个问题,因为它只在新服务器上启动,这就是为什么我觉得这是一个 Apache/PHP 配置问题。
-
当我今天有时间时,我可能会遵循这个线程bugs.php.net/bug.php?id=19263 中的想法。我的另一个想法是在 php 从 tmp 复制数据之前检查数据是否损坏。
-
上面论坛帖子中的想法没有帮助。我还尝试禁用允许并发上传的 session_write_close(),没有骰子。我还将 JSUploader 从 XMLHttpRequest() 上传切换到较旧的 iframe 表单发布方法,结果仍然相同。
标签: php file-upload jpeg corruption