3

我使用 LWP::Simple 库及其 getstore() 函数编写了一个快速脚本来下载文件。它运行良好,但偶尔下载的文件不完整。我不知道是什么原因造成的,但是当我随后在命令行文件中使用 wget 手动下载它时就可以了。

我猜损坏的文件是由连接断开或类似原因引起的,尽管我在数据中心连接的专用线上运行我的脚本可能会在我的服务器和远程服务器之间的某个地方断开。

这是我的代码:

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

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

感谢您的宝贵回复。

4

3 回答 3

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";
...
于 2012-11-09T16:46:36.530 回答
3

对于任何 2XX HTTP 代码,is_success() 子函数都返回 true,因此,例如,如果您获得“206 Partial Content”,这将被视为成功。

您可以检查状态是否为 200,并采取相应措施。

于 2010-08-14T14:49:27.357 回答
2

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

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

于 2010-08-14T14:42:56.203 回答