2010-08-14 3 views
3

LWP :: Simple 라이브러리 및 getstore() 함수를 사용하여 파일을 다운로드하는 빠른 스크립트를 작성했습니다. 오히려 잘 작동하지만 가끔 다운로드 된 파일이 완전하지 않습니다. 이 문제의 원인은 모르겠지만 명령 줄 파일에서 수동으로 wget을 사용하여 나중에 다운로드하면 OK입니다.getstore() 함수를 사용하여 다운로드 한 파일이 완전하지 않거나 손상되었는지 확인하는 방법은 무엇입니까?

데이터 센터 연결의 전용 회선에서 스크립트를 실행해도 내 서버와 원격 서버 사이에 어딘가에 문제가 발생할 수 있지만 손상된 파일은 연결이 끊어 지거나 비슷한 것으로 인해 발생합니다. 이 문제에 대한 가능한 해결책은 무엇

sub download { 
my $status = getstore($_[0], $_[1]); 
if (is_success($status)) { return 1; } else { return 0; } 
} 

:

이 내 코드? 전송이 제대로되었는지 그리고 파일이 완전하고 손상되지 않았는지 확인하는 방법?

귀중한 답장을 보내 주셔서 감사합니다.

+3

일뿐만 아니라 단지'반환 is_success ($ 상태)'. – sarnold

답변

2

얻을 수있는 $status 값은 LWP::Simple documentation에 나열됩니다. 서버가 부분적으로 또는 손상된 다운로드를받을 때마다 오류 상태를 반환하면 반환 값을 확인하는 것으로 충분합니다.

그렇지 않으면 더 복잡한 전략이 필요합니다. 파일에 대한 MD5 또는 SHA 체크섬이있는 경우 다운로드 한 후 체크섬을 확인할 수 있습니다. 그렇지 않다면, 헤더를 조사하고, 서버가 얼마나 많은 양을 보내고 있는지 그리고 얼마나 받았는지 확인해야합니다.

3

임의의 2XX HTTP 코드 인 에 대해 is_success() 서브 프로그램이 true를 반환하므로 예를 들어 "206 부분 콘텐츠"를 얻는 경우 성공으로 계산되는 입니다.

상태가 200인지 여부 만 확인하고 그에 따라 을 행동 할 수 있습니다. 우리는과 같이 할 수

3

:

use LWP; 
use HTTP::Request::Common; 
my $ua = LWP::UserAgent->new; 
$ua->timeout(3); 
my $res = $ua->request(HEAD $url); # just to get headers of a file 
my $length_full = $res->headers->{'content-length'}; 
... 
$res = $request(GET $url); 
my $length_got = $res->content_length; 
if ($length_got != $length_full) { print "File have not been downloaded completely!\n"; 
... 
관련 문제