2009-12-21 6 views

Répondre

8

Un grand merci à Peter Kovacs réponse pour moi conduisant à la bonne réponse. Il s'est avéré être un peu plus complexe que ce à quoi je m'attendais, alors j'ai décidé (horreur) de répondre à ma propre question.

Comme Peter a montré, je peux définir un rappel comme ceci:

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

Mais maintenant, je ne peux pas enregistrer le contenu en utilisant la: valeur content_file, parce que je ne peux choisir l'un des deux. La fonction de rappel reçoit les données, et j'ai fini par écrire cela dans un fichier.

Je reçois également un objet de réponse qui contient la taille totale du contenu comme indiqué friedo. Donc, en gardant un total cumulatif du contenu reçu jusqu'ici et en le divisant par le contenu total, je peux trouver quel pourcentage du contenu a été téléchargé. Voici la fonction de rappel complet:

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 
} 

J'espère que cela aide quelqu'un.

+0

Cela aide. Thanks :) – Mike

+0

Cela fonctionne pour moi. J'ai été en mesure d'utiliser le handle de fichier en tant que fichier temporaire juste pour les statistiques. J'utilise '\ r' pour revenir en arrière et garder le terminal à une ligne quand le pourcentage téléchargé monte et tout ce que j'ai fait après' $ m-> get ($ u, ": content_cb" => \ & callback); 'est appel' $ m-> save_content ($ newLocation); 'Ceci ne télécharge pas le contenu deux fois. Testé sur un fichier 250M. – DataHerder

8

WWW::Mechanize indique que la méthode get est une surcharge «bien conduite» de LWP :: UserAgent get. En regardant les documents pour LWP :: UserAgent, vous pouvez fournir une content_cb clé qui est appelée à chaque morceau du fichier téléchargé:

$mech->get($someurl, ":content_cb" => \&callback); 
sub callback 
{ 
    my($data, $response, $proto) = @_; 
    # save $data to $i.flv 
    # print download notification 
} 
+1

Vous aurez également besoin de quelque chose pour obtenir la taille totale (si disponible des en-têtes de réponse http) – ysth

+4

Vous pouvez obtenir la taille assez facilement en regardant '$ mech-> response-> header ('Content-Length') ', en supposant que le serveur envoie cet en-tête. (Pour un contenu dynamique, vous pourriez ne pas avoir de chance.) – friedo

Questions connexes