2010-08-14 2 views
3

Я написал быстрый скрипт для загрузки файлов с использованием LWP :: Simple library и его функции getstore(). Он работает довольно хорошо, но иногда загруженный файл не завершен. Я не знаю, что это вызывает, но когда я загружу его вручную, wget в файле командной строки в порядке.Как проверить, не загружен ли загруженный файл с использованием функции getstore()?

Я бы предположил, что поврежденные файлы вызваны удалением соединения или чем-то подобным, хотя я запускаю свой сценарий по выделенной линии в соединении с датацентром, где-то между моим сервером и удаленным сервером может произойти сбой.

Это мой код:

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

Каковы возможные решения этой проблемы? Как проверить, прошла ли передача, и если файл завершен и не поврежден?

Спасибо за ваши ценные ответы.

+3

мая, а просто 'возвращение is_success ($ статус);'. – sarnold

ответ

2

Значения $status, которые вы можете получить, указаны в LWP::Simple documentation. Если серверы возвращают статус ошибки каждый раз, когда вы получаете частичную или поврежденную загрузку, достаточно проверить возвращаемое значение.

В противном случае вам понадобится более сложная стратегия. Если для файлов есть контрольные суммы MD5 или SHA, вы можете проверить их после загрузки. Если нет, вам нужно проверить заголовки, узнать, сколько сервер планирует отправить и сколько вы получили.

3

Подтверждение is_success() возвращает true для любого кода HTTP 2XX, , так что если вы, например, получаете «206 частичный контент», , который будет считаться успехом.

Вы можете просто проверить, является ли статус 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"; 
... 
Смежные вопросы