2010-08-14 75 views
3

我写了一个快速脚本来使用LWP :: Simple库及其getstore()函数下载文件。它工作得很好,但偶尔下载的文件不完整。我不知道是什么导致了这一点,但是当我在命令行文件中使用wget手动下载之后,就可以了。如何使用getstore()函数检查下载的文件是否完整/损坏?

我猜想损坏的文件是由连接丢失或类似的东西造成的,尽管我在数据中心连接的专用线上运行我的脚本可能会丢失我的服务器和远程服务器之间的某处。

这是我的代码:

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

什么是这个问题的可能的解决方案?如何检查传输是否正常以及文件是否完整并且没有损坏?

谢谢你的宝贵回复。

+3

可能也只是'回报is_success($状态);'。 – sarnold 2010-08-14 11:13:02

回答

2

您可以获得的$status值列在LWP::Simple documentation中。如果服务器在每次出现部分或损坏的下载时都返回错误状态,只需检查返回值就足够了。

否则,您需要更复杂的策略。如果文件有MD5或SHA校验和,可以在下载后检查。如果没有,您需要检查标题,查明服务器计划发送多少以及您收到多少。

3

对于任何2XX HTTP代码,is_success()子句返回true,所以如果您例如获得将被视为成功的“206 Partial Content”, 。

您可以检查状态是否为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"; 
...