2009-12-21 8 views

Respuesta

8

Muchas gracias a la respuesta de Peter Kovacs para mí que conduce a la respuesta correcta. Resultó ser un poco más elaborado de lo que esperaba, así que decidí (horror) responder mi propia pregunta.

Como Peter mostró, que puede establecer una devolución de llamada de esta manera:

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

Pero ahora no puedo guardar el contenido mediante el: content_file valor, porque sólo se puede elegir uno de los dos. La función de devolución de llamada pasa los datos, y terminé escribiéndolo en un archivo.

También recibo un objeto de respuesta que contiene el tamaño total del contenido como señaló friedo. Así que al mantener un total acumulado de contenido recibido hasta ahora y dividiéndolo por el contenido total, puedo averiguar qué porcentaje del contenido se ha descargado. Aquí está la función de devolución de llamada completa:

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 
} 

Espero que ayude a alguien.

+0

Esto ayuda. Gracias :) – Mike

+0

Esto funciona para mí. Pude usar el identificador de archivo como archivo temporal solo para estadísticas. Uso '\ r' para retroceder y mantener el terminal en una línea a medida que el porcentaje descargado aumenta y todo lo que hice después de' $ m-> get ($ u, ": content_cb" => \ & callback); 'es llamada' $ m-> save_content ($ newLocation); 'Esto no descarga el contenido dos veces. Probado en un archivo de 250M. – DataHerder

8

WWW::Mechanize dice que el método get es una sobrecarga "de buen comportamiento" de LWP :: UserAgent get. En cuanto a la documentación para LWP :: agente de usuario, puede proporcionar una clave content_cb que se llama con cada fragmento del archivo descargado:

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

También necesitaría algo para obtener el tamaño total (si está disponible en los encabezados de respuesta http) – ysth

+4

Puede obtener el tamaño con bastante facilidad mirando '$ mech-> response-> header ('Content-Length') ', suponiendo que el servidor envía ese encabezado. (Para contenido dinámico, puede que no tenga suerte). – friedo

Cuestiones relacionadas