【问题标题】:How to check if downloaded file using getstore() function is not complete/corrupted?如何检查使用 getstore() 函数下载的文件是否不完整/损坏?
【发布时间】:2010-08-14 11:10:01
【问题描述】:

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

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

这是我的代码:

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

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

感谢您的宝贵回复。

【问题讨论】:

  • 也可以return is_success($status);

标签: perl lwp


【解决方案1】:

is_success() 子函数对任何 2XX HTTP 代码返回 true, 因此,例如,如果您要获取“206 Partial Content”, 这将算作成功。

您可以检查状态是否为200,然后执行 相应地。

【讨论】:

    【解决方案2】:

    我们可以这样做:

    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";
    ...
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-29
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2017-10-26
        相关资源
        最近更新 更多