如何向WWW :: Mechanize添加进度条?

Vla*_*ala 7 perl www-mechanize progress-bar

我有以下代码:

$mech->get($someurl, ":content_file" => "$i.flv");
Run Code Online (Sandbox Code Playgroud)

所以我得到一个url的内容并将其保存为flv文件.我想每隔一秒打印一下,剩下多少下载.有没有办法在WWW :: Mechanize中实现这一目标?

Pet*_*acs 8

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
 }
Run Code Online (Sandbox Code Playgroud)

  • 假设服务器发送该标头,您可以通过查看`$ mech-> response-> header('Content-Length')`来轻松获得大小.(对于动态内容,你可能会运气不好.) (4认同)

Vla*_*ala 8

非常感谢Peter Kovacs回答我的正确答案.事实证明它比我预期的要复杂得多,所以我决定(恐怖地)回答我自己的问题.

正如彼得所示,我可以像这样设置一个回调:

$m->get($u, ":content_cb" => \&callback);
Run Code Online (Sandbox Code Playgroud)

但是现在我无法使用:content_file值保存内容,因为我只能选择其中一个.回调函数传递数据,我最终将其写入文件.

我还得到一个响应对象,其中包含friedo指出的内容的总大小.因此,通过保持到目前为止收到的内容的运行总数并将其除以总内容,我可以找出已下载的内容的百分比.这是完整的回调函数:

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
}
Run Code Online (Sandbox Code Playgroud)

我希望能有所帮助.