2010-08-14 108 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"; 
...