2011-07-10 104 views
3

我们有一个使用Andrew Valums ajax文件上传器的网络应用程序,如果我们一次启动5 - 10个图像上传,更常见的是至少2或3会导致相同的gd错误“Corrupt JPEG数据”PHP文件上传损坏的JPEGS

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号出现了很多。

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

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

+1

我可能帮不了你,但这是一个很好的问题,很好的工作 – rockerest

+0

这可能不是一个解决方案,但你有没有尝试过不同的方法网络服务器?总是有'nginx'和'lighttpd'。 – Blender

+0

是的我确定不同的服务器可以解决这个问题,因为它只在新服务器上启动,这就是为什么我觉得这是一个Apache/PHP的配置问题。 –

回答

1

嗯,我认为问题是jpeg头数据,并且据我所知PHP没有任何关系,我认为问题在于你的文件上传器,也许有一些配置是你的失踪。

+0

问题是jpeg头数据,但我不同意它是错误的JS上传器,甚至是上传器的PHP脚本端,因为我们在两台独立的服务器(Godaddy和localhost在笔记本电脑上)上运行它,并且无法重现错误,它只发生在我们的新生产服务器上。 –

+0

如果我在哪里,我会测试简单的上传脚本,以确保关于服务器工作的一切都很好。你可能想通过手动创建jpeg头来解决这个问题(我不认为这是正确的做法),看看这个:[link](http://en.wikipedia.org/wiki/ JPEG#Syntax_and_structure) – 2011-07-12 07:59:02

0

嗯 - 一个64字节的腐败?...或者你的意思是64位?

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

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

这里阅读更多信息,关于这个问题:

http://us2.php.net/manual/en/function.fopen.php

2

有些相机会追加将得到不正确的解释文件中的一些数据(最有可能做的字符编码与头)。

我找到了一个解决办法是阅读二进制模式的文件,像这样

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

$test = @imagecreatefromstring($str); 

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

这可以解决:

ini_set ('gd.jpeg_ignore_warning', 1); 
0

我有这个问题与GoDaddy托管。 我已经使用他们的cPanel接口在GoDaddy上创建了数据库。它被创建为“拉丁整理”(或类似的东西)。开发服务器上的数据库是UTF8。我试过这个页面上的所有解决方案,都无济于事。然后我将数据库转换为UTF8,并工作。

数据库编码不应该影响BLOB数据(或者我会认为)。 BLOB代表BINARY大对象(某事......),就我所知!

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

编辑:刚刚看了一下MySQL的导出脚本,那就是:
INSERT INTO ... VALUES(...,4.1.x或更高版本0xFFD8FF ...

不管怎么说,希望这将有助于OP没有指出什么解决了他的问题...