我写了一个快速脚本来使用LWP :: Simple库及其getstore()函数下载文件。它工作得很好,但偶尔下载的文件不完整。我不知道是什么导致了这个,但是当我在命令行文件中手动使用wget后手动下载它是可以的。
我猜测损坏的文件是由连接丢弃或类似的东西引起的,虽然我在数据中心连接的专用线路上运行我的脚本可能会丢弃在我的服务器和远程服务器之间。
这是我的代码:
sub download {
my $status = getstore($_[0], $_[1]);
if (is_success($status)) { return 1; } else { return 0; }
}
此问题的可能解决方案是什么?如何检查传输是否正常以及文件是否完整且未损坏?
感谢您的宝贵回复。
答案 0 :(得分:3)
对于任何2XX HTTP代码,is_success()子函数返回true, 所以,如果您要获得“206 Partial Content”, 这将被视为成功。
你可以检查状态是否为200,然后采取行动 相应
答案 1 :(得分: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";
...
答案 2 :(得分:2)
$status
可列出{{1}}值。LWP::Simple documentation。如果每次下载部分或损坏时服务器都返回错误状态,只需检查返回值即可。
否则,您需要更复杂的策略。如果文件有MD5或SHA校验和,则可以在下载后检查这些校验和。如果没有,您需要检查标题,找出服务器计划发送的数量以及您收到的数量。