2009-12-21 23 views
7

मेरे पास निम्न कोड है:मैं WWW :: मशीनीज़ में प्रगति पट्टी कैसे जोड़ सकता हूं?

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

तो मुझे एक यूआरएल की सामग्री मिल रही है और इसे एक फ्लॉव फ़ाइल के रूप में सहेज रहा है। मैं हर दूसरे को मुद्रित करना चाहता हूं या तो कितना डाउनलोड शेष है। क्या WWW :: मैकेनाइजेशन में इसे पूरा करने का कोई तरीका है?

उत्तर

8

मुझे सही जवाब के लिए अग्रणी के लिए पीटर कोवाक्स 'जवाब देने के लिए बहुत धन्यवाद: LWP :: UserAgent के लिये दस्तावेज को देखते हुए, आप एक content_cb कुंजी जो डाउनलोड की गई फ़ाइल के प्रत्येक टुकड़ा के साथ कहा जाता है प्रदान कर सकते हैं। यह अपेक्षा की तुलना में थोड़ा अधिक विस्तृत साबित हुआ, हालांकि मैंने फैसला किया कि (डरावनी) मेरे अपने प्रश्न का उत्तर दें।

के रूप में पीटर से पता चला है, मैं इतना की तरह एक कॉलबैक सेट कर सकते हैं:

$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 
} 

मुझे आशा है कि किसी की सहायता करें।

+0

इससे मदद मिलती है। धन्यवाद :) – Mike

+0

यह मेरे लिए काम करता है। मैं डेटा हैंडल का उपयोग केवल आंकड़ों के लिए एक temp फ़ाइल के रूप में करने में सक्षम था। मैं बैकस्पेस में '\ r' का उपयोग करता हूं और टर्मिनल को एक पंक्ति पर रखता हूं क्योंकि डाउनलोड किया गया प्रतिशत बढ़ जाता है और मैंने '$ m-> प्राप्त करने के बाद किया ($ u,": content_cb "=> \ & callback);' कॉल ' $ m-> save_content ($ newLocation); 'यह सामग्री को दो बार डाउनलोड नहीं करता है। एक 250 एम फ़ाइल पर परीक्षण किया। – DataHerder

8

WWW::Mechanize कहता है कि get विधि LWP :: UserAgent get का "अच्छी तरह से व्यवहार" अधिभार है।

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

आपको कुल आकार प्राप्त करने के लिए कुछ भी चाहिए (यदि http प्रतिक्रिया शीर्षलेख से उपलब्ध है) – ysth

+4

आप '$ mech-> प्रतिक्रिया-> शीर्षलेख (' सामग्री-लंबाई ') देखकर आसानी से आकार प्राप्त कर सकते हैं। 'मानते हैं कि सर्वर उस हेडर भेजता है। (गतिशील सामग्री के लिए, आप भाग्य से बाहर हो सकते हैं।) – friedo

संबंधित मुद्दे