Как проверить, что загруженный файл с помощью функции getstore () не завершен / не поврежден? - PullRequest
3 голосов
/ 14 августа 2010

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

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

Это мой код:

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

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

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

Ответы [ 3 ]

3 голосов
/ 14 августа 2010

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

3 голосов
/ 09 ноября 2012

Мы можем сделать так:

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";
...
2 голосов
/ 14 августа 2010

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

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

...