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

is_success()サブはすべての2XX HTTPコードに対してtrueを返します。したがって、たとえば「206部分コンテンツ」を取得している場合、それは成功としてカウントされます。

ステータスが200かどうかを確認し、それに応じて行動することができます。

于 2010-08-14T14:49:27.357 に答える
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 に答える
2

$status取得できる値は、LWP::Simpleドキュメントにリストされています。部分的または破損したダウンロードを取得するたびにサーバーがエラーステータスを返す場合は、戻り値を確認するだけで十分です。

そうでなければ、より洗練された戦略が必要になります。ファイルにMD5またはSHAチェックサムがある場合は、ダウンロード後にそれらをチェックできます。そうでない場合は、ヘッダーを調べて、サーバーが送信する予定の量と受信した量を確認する必要があります。

于 2010-08-14T14:42:56.203 に答える