У меня есть следующий код:
$mech->get($someurl, ":content_file" => "$i.flv");
Таким образом, я получаю содержание URL и сохраняю его как flv файл. Я хотел бы распечатать каждую приблизительно секунду, сколько из загрузки остается. Есть ли любой способ выполнить это в WWW:: Механизировать?
Большое спасибо Питеру Ковачу за ответ, приведший меня к правильному ответу. Однако он оказался немного сложнее, чем я ожидал, поэтому я решил (ужас) ответить на свой собственный вопрос.
Как показал Питер, я могу установить обратный вызов следующим образом:
$m->get($u, ":content_cb" => \&callback);
Но теперь я не могу сохранить содержимое, используя значение :content_file, потому что я могу выбрать только одно из двух. Функция обратного вызова получает данные, и вместо этого я записываю их в файл.
Я также получаю объект ответа, который содержит общий размер содержимого, как указал Фридо. Таким образом, сохраняя текущий общий размер полученного до сих пор содержимого и деля его на общий размер, я могу узнать, какой процент содержимого был загружен. Вот полная функция обратного вызова:
open (VID,">$i.flv") or die "$!";
$total = 0;
sub callback
{
my( $data, $response, $proto ) = @_;
print VID "$data"; # write data to file
$total+= length($data);
$size = $response->header('Content-Length');
print floor(($total/$size)*100),"% downloaded\n"; # print percent downloaded
}
Надеюсь, это кому-нибудь поможет.
. WWW :: Mechanize
говорит, что метод get
- это «корректная» перегрузка LWP :: UserAgent get
. Просматривая документацию для LWP :: UserAgent, вы можете предоставить ключ content_cb
, который вызывается с каждым фрагментом загруженного файла:
$mech->get( $someurl, ":content_cb" => \&callback );
sub callback
{
my( $data, $response, $proto ) = @_;
# save $data to $i.flv
# print download notification
}