2011-07-10 58 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沒有指出什麼解決了他的問題...