2011-03-24 5 views
2

웹 크롤러를 구축 중이며 기능 중 하나는 이미지를 다운로드하는 것입니다.이미지 무결성을 확인하는 방법?

예를 들어, 어떤 이유로 이미지에 오류가있는 이미지가있는 경우가 있습니다. 예 : 이미지의 절반이 보통 회색 또는 흰색으로 어떤 점에서 다운로드가 중단 된 것처럼 보이며 공백을 채 웁니다. 회색. 이미지 유형은 getimagesize로 가져올 수 있기 때문에 여전히 유효한 것으로 간주되며, 또한 열어서 볼 수 있습니다. 그러나 그들은 원본과 다르다.

아이디어가 있으십니까?

답변

1

응답 헤더 Content-Length과 수신 한 실제 바이트 수를 비교하십시오. 다른 이유가있을 수 있지만 이미지를 다운로드 한 곳에서 코드를 보지 않고는 아무 것도 말할 수 없습니다.

+0

뭔가 ($ 응답 [ '몸']) === $ 응답 [ 'CONTENT_LENGTH']? 이것은 효과가있는 것 같지만, 확실한 또 다른 깨진 이미지를 찾을 때까지 기다려야 할 것입니다. – HappyDeveloper

+0

예, 그런 식으로 데이터 (컬, 소켓 또는 다른 것)를 검색하는 데 사용하는 항목에 따라 다릅니다. 그리고'=='만으로도 충분하다고 생각합니다. 보통 헤더가 있기 때문에'strlen ($ response [ 'body']) === intval ($ response [ 'content_length'])'를 추가해야합니다. 문자열로. – Slava

1

나는 이것이 전송 중단이라고 생각한다.

많은 경우가 있습니다. 연결이 재설정되었거나,이 경우 소켓 신호를 테스트하면 문제를 진단하고 다운로드를 시작할 수 있습니다.

또는 전송 중에 감지되지 않은 오류가 있지만 (일반적으로 TCP/IP가이를 처리해야 함) 모든 다운로드를 올바르게 작성하지 않아야합니다 (사용자가 소켓의 모든 데이터를 읽은 것으로 생각하지만 읽기는 가장 작은 값이며 반환 된 값을 검사하여 의도 한 크기인지 확인하지 않음) 이미지가 완성되지 않았습니다.

보통 반 회색 이미지 (특히 JPEG)는 완료되지 않은 파일의 부호입니다 (헤더는 정상이므로 getimagesize에 문제가 없으므로). 그러나 JPEG는 0xFF 0xD9으로 끝나지 않습니다. 따라서 읽어야하는 크기와 비교하여 모든 데이터를 읽었는지 확인하십시오. 결국 이미지 형식 종속 기능을 작성하여 예를 들어 JPEG 내의 플래그를 확인하여 파일의 무결성을 검사 할 수 있습니다. 하지만 리소스를 많이 소비 할 수 있습니다.

1

은 그냥 imagecreatefromstring()와 검사를 할 경우 반환하지 나 strlen 같은 자원