2009-12-21 17 views

risposta

8

Molte grazie a risposta Peter Kovacs' per me che porta alla risposta corretta. Si è rivelato un po 'più elaborato di quanto mi aspettassi, quindi ho deciso di rispondere (orrore) alla mia domanda.

Come Peter ha mostrato, posso impostare una richiamata in questo modo:

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

Ma ora non può salvare il contenuto utilizzando il: valore di content_file, perché posso scegliere solo uno dei due. La funzione di callback ha passato i dati e ho finito per scriverli su un file.

Ho anche ricevuto un oggetto risposta che contiene la dimensione totale del contenuto come indicato da friedo. Quindi, mantenendo un totale parziale di contenuti ricevuti finora e dividendolo per il contenuto totale, posso scoprire quale percentuale del contenuto è stata scaricata. Ecco la funzione di callback 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 
} 

Spero che questo aiuti qualcuno.

+0

Questo aiuta. Grazie :) – Mike

+0

Questo funziona per me. Sono stato in grado di utilizzare il file handle come file temporaneo solo per le statistiche. Io uso '\ r' per tornare indietro e mantenere il terminale su una riga mentre la percentuale scaricata aumenta e tutto ciò che ho fatto dopo' $ m-> get ($ u, ": content_cb" => \ & callback); 'is call' $ m-> save_content ($ newLocation); 'Questo non scarica il contenuto due volte. Testato su un file 250M. – DataHerder

8

WWW::Mechanize afferma che il metodo get è un sovraccarico "ben educato" di LWP :: UserAgent get. Guardando la documentazione per LWP :: UserAgent, è possibile fornire una chiave content_cb che viene chiamato con ogni blocco del file scaricato:

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

Avresti anche bisogno di qualcosa per ottenere la dimensione totale (se disponibile dalle intestazioni delle risposte http) – ysth

+4

Puoi ottenere le dimensioni abbastanza facilmente guardando l'intestazione '$ mech-> response-> ('Content-Length') ', supponendo che il server invii quell'intestazione. (Per contenuti dinamici, potresti essere sfortunato.) – friedo

Problemi correlati