我正在構建一個網絡爬蟲,其功能之一是下載圖像。如何檢查圖像的完整性?
問題在於,有時出於某種原因,圖像下載時會出現錯誤,例如:圖像的一半是灰色或白色,像停止在某個點下載,然後填充空白與灰色。圖像類型仍然被認爲是有效的,因爲我可以通過getimagesize獲取它們,並打開並查看它們。但他們不像原件。
任何想法?
我正在構建一個網絡爬蟲,其功能之一是下載圖像。如何檢查圖像的完整性?
問題在於,有時出於某種原因,圖像下載時會出現錯誤,例如:圖像的一半是灰色或白色,像停止在某個點下載,然後填充空白與灰色。圖像類型仍然被認爲是有效的,因爲我可以通過getimagesize獲取它們,並打開並查看它們。但他們不像原件。
任何想法?
將響應標頭Content-Length
與實際收到的字節數進行比較。可能還有其他原因,但是如果沒有在下載該映像的地方查看代碼,我什麼都不能告訴。
我認爲這是傳輸中斷。
我看到很多情況:或者您的連接已重置,在這種情況下,測試套接字信號應使您能夠診斷問題並重新啓動下載。或者你沒有正確寫下所有的下載文件(你認爲你讀取了套接字上的所有數據,但是讀取提供了一個最小的值,你不檢查返回的值來檢查它的預期大小),然後你的圖像不完整。
通常一半的灰色圖像(特別是JPEG)是一個文件不完整的標誌(標頭沒問題,所以你沒有問題getimagesize),但JPEG不會以0xFF 0xD9
結束。所以請檢查你閱讀所有的數據,通過比較你必須閱讀的大小。 最終,您可以編寫圖像格式相關函數來檢查文件的完整性,例如通過檢查JPEG中的標誌。但這可能會消耗資源。
只是做一個imagecreatefromstring(),調查的回報不是資源
喜歡的東西的strlen($響應[ '身體'])=== $迴應[ 'CONTENT_LENGTH']?這似乎工作,但我將不得不等待,直到我發現另一個破碎的圖像是肯定的。 – HappyDeveloper 2011-03-24 16:57:46
是的,類似的,取決於你用來檢索數據(捲曲,套接字或其他)。我認爲'=='就足夠了,或者你必須添加'strlen($ response ['body'])=== intval($ response ['content_length'])',因爲頭文件通常被保存作爲字符串。 – Slava 2011-03-24 19:15:51