7

私は次のコードを持っています:

$mech->get($someurl, ":content_file" => "$i.flv");

だから私はURLの内容を取得してflvファイルとして保存しています。残りのダウンロード量を1秒ごとに印刷したいのですが。WWW :: Mechanizeでこれを達成する方法はありますか?

4

2 に答える 2

8

WWW::Mechanizegetメソッドは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
 }
于 2009-12-21T01:49:21.737 に答える
8

私を正しい答えに導いてくれたPeterKovacsの答えに感謝します。思ったより少し凝っていたので、(ホラー)自分の質問に答えることにしました。

Peterが示したように、次のようにコールバックを設定できます。

$m->get($u, ":content_cb" => \&callback);

しかし、2つのうち1つしか選択できないため、: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
}

それが誰かに役立つことを願っています。

于 2009-12-21T05:59:48.713 に答える