私は Web クローラーを構築していますが、その機能の 1 つは画像をダウンロードすることです。
問題は、何らかの理由でダウンロードされた画像にエラーがある場合があることです。たとえば、ある時点でダウンロードが停止したように、画像の半分が無地の灰色または白で、空白が灰色で埋められます。画像タイプは、getimagesize で取得でき、開いて表示できるため、引き続き有効であると見なされます。しかし、彼らはオリジナルのようではありません。
何か案は?
私は Web クローラーを構築していますが、その機能の 1 つは画像をダウンロードすることです。
問題は、何らかの理由でダウンロードされた画像にエラーがある場合があることです。たとえば、ある時点でダウンロードが停止したように、画像の半分が無地の灰色または白で、空白が灰色で埋められます。画像タイプは、getimagesize で取得でき、開いて表示できるため、引き続き有効であると見なされます。しかし、彼らはオリジナルのようではありません。
何か案は?
imagecreatefromstring() を実行するだけで、リソース以外が返されるかどうかを確認できます
応答ヘッダーContent-Length
を、受信した実際のバイト数と比較します。他にも理由があるかもしれませんが、その画像をダウンロードするコードを見ないと何もわかりません。
通信障害だと思います。
多くのケースを目にします。接続がリセットされたかのどちらかです。この場合、ソケット信号をテストすることで問題を診断し、ダウンロードを再開できるはずです。
または、送信中に未検出のエラーが発生した場合 (ただし、通常は TCP/IP がこれに対処する必要があります) および/またはダウンロードしたすべてのデータを正しく書き込んでいない場合 (ソケット上のすべてのデータを読み取ったと思いますが、read は最小値を提供し、戻り値をチェックして意図したサイズであることを確認しません)、画像は完全ではありません。
通常、ハーフ グレーの画像 (特に JPEG) はファイルが不完全であることを示しています (ヘッダーは問題ないので、getimagesize で問題はありません) が、JPEG は . で終わっていません0xFF 0xD9
。したがって、読み取る必要があるサイズと比較して、すべてのデータを読み取ったことを確認してください。最終的には、たとえば JPEG 内のフラグをチェックすることによって、ファイルの整合性をチェックするイメージ フォーマット依存関数を作成できます。ただし、リソースを消費する可能性があります。