PHP文件上载损坏的JPEG

PHP文件上载损坏的JPEG,php,file-upload,jpeg,corruption,Php,File Upload,Jpeg,Corruption,我们有一个使用Andrew Valums ajax文件上传器的web应用程序,如果我们一次启动5-10个图像上传,那么更多情况下,至少2个或3个会导致相同的gd错误“损坏的JPEG数据” 然而,这并没有发生在我们的旧测试服务器或本地开发盒上,而是发生在我们的新生产服务器上 服务器上的文件大小与本地计算机上的原始文件大小相同,因此它完成了上载,但我认为服务器正在损坏数据 我可以通过删除并再次上传或通过FTP手动上传来“修复”损坏的文件 我们在Godaddy上有一个共享主机,刚开始在一个新的盒子上出

我们有一个使用Andrew Valums ajax文件上传器的web应用程序,如果我们一次启动5-10个图像上传,那么更多情况下,至少2个或3个会导致相同的gd错误“损坏的JPEG数据”

然而,这并没有发生在我们的旧测试服务器或本地开发盒上,而是发生在我们的新生产服务器上

服务器上的文件大小与本地计算机上的原始文件大小相同,因此它完成了上载,但我认为服务器正在损坏数据

我可以通过删除并再次上传或通过FTP手动上传来“修复”损坏的文件

我们在Godaddy上有一个共享主机,刚开始在一个新的盒子上出现这个问题(我设置了这个盒子,所以可能解释了很多:)CentOS 5.5+、Apache 2.2.3、PHP 5.2.10

你可以在这里看到一些好的和坏的例子

当我绑定它们时,我看到一个一致的模式,损坏总是64字节的块,虽然损坏块之间的距离不是恒定的,但4356的数量会增加很多

我真的认为我们可以排除互联网,因为错误检查和TCP重传是非常可靠的,而且浏览器版本之间似乎没有区别,或者如果我关闭防病毒和防火墙


所以我选择了Apache/PHP的配置?

嗯,我认为问题在于jpeg头数据,据我所知,这与PHP无关,我认为问题在于您的文件上传程序,可能您缺少一些配置。

嗯-64字节损坏?…或者您是指64位

我想说的是,这个问题实际上是PHP脚本的结果。这里经常出现的问题是,脚本将CRLF插入正在上载的数据流中,这是由Window/*nix标准之间的差异引起的

解决方案是强制php脚本以二进制模式上载(对php上载中的所有fopen()命令使用+b开关)。以二进制模式上传文本文件是安全的,因为至少您仍然可以看到数据

有关此问题的更多信息,请阅读此处:


一些摄像头会在文件中附加一些数据,这些数据会被错误地解释(很可能会在标题中使用字符编码)

我找到了一个解决方案,就是像这样以二进制模式读取文件

$fh = fopen('test.jpg', 'rb');
$str = '';
while($fh !== false && !feof($fh)){
    $str .= fread($fh, 1024);
}

$test = @imagecreatefromstring($str);

imagepng($test,'save.png');

这可以通过以下方法解决:

ini_set ('gd.jpeg_ignore_warning', 1);

我在GoDaddy主机上遇到了这个问题。 我使用他们的cPanel接口在GoDaddy上创建了数据库。它被创建为“拉丁整理”(或类似的东西)。开发服务器上的数据库是UTF8。我在这一页上尝试了所有的解决方案,都没有用。然后我把数据库转换成UTF8,它就工作了

数据库编码不应该影响BLOB数据(或者我认为是这样)。据我所知,BLOB代表二进制大型对象(某物…)

而且,奇怪的是,数据是从开发人员复制到生产服务器的,而数据库仍然是“拉丁语”,而且根本没有损坏。只有在插入新图像时才出现问题。所以我猜图像数据是作为文本数据输入MySQL的,我认为有一种方法(使用SQL时)插入二进制数据,我没有遵循它

编辑:刚刚看了一下MySQL导出脚本,它是:
插入到。。。值(…,\u二进制0xFFD8FF


无论如何,希望这能帮助到某人。OP没有指出是什么解决了他的问题…

我可能无法在这里帮助你,但这是一个好问题。干得好。这可能不是一个解决方案,但你尝试过不同的Web服务器吗?总是有
nginx
lighttpd
。是的,我肯定不同的服务器会解决这个问题问题,因为它只在新服务器上启动,这就是为什么我觉得这是Apache/PHP配置问题。今天有时间时,我可能会遵循这个线程中的想法。我的另一个想法是在PHP从tmp复制数据之前检查数据是否损坏。上面论坛线程中的想法没有帮助。我还尝试禁用会话_write_close()这允许并发上传,不需要掷骰子上传到旧的iframe form post方法,仍然是相同的结果。问题是jpeg头数据,但我不同意这是JS上传程序的错误,甚至是上传程序的PHP脚本端的错误,因为我们在两个单独的服务器(Godaddy和笔记本电脑上的localhost)上运行了该方法并且无法重现错误,它只发生在我们新的生产服务器上。如果我需要您,我将测试简单的上载脚本,以确保服务器工作正常。您可能希望通过手动创建jpeg头来解决此问题(我不认为这是正确的做法),请查看以下内容:
ini_set ('gd.jpeg_ignore_warning', 1);