我有以下代码:
$mech->get($someurl, ":content_file" => "$i.flv");
所以我正在获取一个 url 的内容并将其保存为一个 flv 文件。我想每隔一秒左右打印出剩余的下载量。有没有办法在 WWW::Mechanize 中实现这一点?
我有以下代码:
$mech->get($someurl, ":content_file" => "$i.flv");
所以我正在获取一个 url 的内容并将其保存为一个 flv 文件。我想每隔一秒左右打印出剩余的下载量。有没有办法在 WWW::Mechanize 中实现这一点?
非常感谢 Peter Kovacs 的回答让我找到了正确的答案。事实证明它比我预期的要复杂一些,所以我决定(恐怖地)回答我自己的问题。
正如彼得所示,我可以像这样设置回调:
$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
}