2012-12-06 14 views
8

द्वारा डाउनलोड की गई फ़ाइल को सहेजने के लिए एक निष्पादन योग्य फ़ाइल प्रकार डाउनलोड करने के लिए एलएमपी का उपयोग करके और स्मृति में प्रतिक्रिया के साथ, मैं फ़ाइल को हैश करने में सक्षम हूं। हालांकि मैं इस फाइल को अपने सिस्टम पर कैसे सहेज सकता हूं? मुझे लगता है कि मैं नीचे क्या कोशिश कर रहा हूं के साथ गलत ट्रैक पर हूं। डाउनलोड सफल है क्योंकि मैं हैश सही ढंग से उत्पन्न करने में सक्षम हूं (मैंने वास्तविक फ़ाइल को डाउनलोड करके और हैश की तुलना करके इसे दो बार जांच लिया है)।perl lwp

use strict; 
use warnings; 
use LWP::Useragent; 
use Digest::MD5 qw(md5_hex); 
use Digest::MD5::File qw(file_md5_hex); 
use File::Fetch; 

my $url = 'http://www.karenware.com/progs/pthasher-setup.exe'; 
my $filename = $url; 
$filename =~ m/.*\/(.*)$/; 
$filename = $1; 
my $dir ='/download/two'; 
print "$filename\n"; 

my $ua = LWP::UserAgent->new(); 
my $response = $ua->get($url); 
die $response->status_line if !$response->is_success; 
my $file = $response->decoded_content(charset => 'none'); 
my $md5_hex = md5_hex($file); 
print "$md5_hex\n"; 
my $save = "Downloaded/$filename"; 
    unless(open SAVE, '>>'.$save) { 
     die "\nCannot create save file '$save'\n"; 
    } 
    print SAVE $file; 
    close SAVE; 

आप मैं क्यों बजाय सब कुछ डाउनलोड नहीं करते हैं तो प्रत्येक फ़ाइल और हैश के लिए फ़ोल्डर पार्स सोच रहे हैं, तो इसकी वजह से im एक पाश में इन सभी फ़ाइलों को डाउनलोड। और प्रत्येक लूप के दौरान, मैं एक ही समय में फ़ाइल नाम और हैश डेटाबेस में प्रासंगिक स्रोत यूआरएल (जहां यह फ़ाइल मिली थी) अपलोड करें।

उत्तर

9

प्रयास करें getstore()LWP::Simple से

use strict; 
use warnings; 
use LWP::Simple qw(getstore); 
use LWP::UserAgent; 
use Digest::MD5 qw(md5_hex); 
use Digest::MD5::File qw(file_md5_hex); 
use File::Fetch; 

my $url = 'http://www.karenware.com/progs/pthasher-setup.exe'; 
my $filename = $url; 
$filename =~ m/.*\/(.*)$/; 
$filename = $1; 
my $dir ='/download/two'; 
print "$filename\n"; 

my $ua = LWP::UserAgent->new(); 
my $response = $ua->get($url); 
die $response->status_line if !$response->is_success; 
my $file = $response->decoded_content(charset => 'none'); 
my $md5_hex = md5_hex($file); 
print "$md5_hex\n"; 
my $save = "Downloaded/$filename"; 
getstore($url,$save); 
+0

धन्यवाद बहुत कुछ, हालांकि getstore() का नकारात्मक पक्ष यह है कि फ़ोल्डर पहले से मौजूद होना चाहिए। मैं एक पल के लिए चौंक गया जब कोई फ़ाइल/फ़ोल्डर दिखाई नहीं दिया। –

1

getstore एक उत्कृष्ट समाधान है, लेकिन किसी और एक अलग सेटअप में यह प्रतिक्रिया पढ़ने, यह समस्या का समाधान नहीं हो सकता है के लिए।

सबसे पहले, आप शायद बाइनरी/टेक्स्ट मुद्दे से पीड़ित हो सकते हैं।

मैं बदल देंगे

my $save = "Downloaded/$filename"; 
unless(open SAVE, '>>'.$save) { 
    die "\nCannot create save file '$save'\n"; 
} 
print SAVE $file; 
close SAVE; 

my $save = "Downloaded/$filename"; 
open my $fh, '>>', $save or die "\nCannot create save file '$save' because $!\n"; 
# on platforms where this matters 
# (like Windows) this is needed for 
# 'binary' files: 
binmode $fh; 
print $fh $file; 
close $fh; 

कारण मुझे पसंद करने के लिए इस बेहतर है कि यदि आप सेट या आपके ब्राउज़र वस्तु ($ UA) पर कुछ सेटिंग का अधिग्रहण किया है, वे कर रहे हैं एलडब्लूपी में अनदेखा :: सरल की गेटस्टोर, क्योंकि यह अपने ब्राउज़र का उपयोग करता है।

इसके अलावा, यह खुले के तीन पैरामीटर संस्करण का उपयोग करता है जो सुरक्षित होना चाहिए।

एक और समाधान कॉलबैक विधि का उपयोग करना होगा और फ़ाइल डाउनलोड करते समय फ़ाइल को स्टोर करना होगा, उदाहरण के लिए यदि आप एक बड़ी फ़ाइल से निपट रहे हैं। हैशिंग एल्गोरिथ्म परिवर्तित करने की तो यह शायद यहाँ प्रासंगिक नहीं है लेकिन यहाँ एक नमूना है होगा:

my $req = HTTP::Request->new(GET => $uri); 
open(my $fh, '>', $filename) or die "Could not write to '$filename': $!"; 
binmode $fh; 
$res = $ua->request($req, sub { 
    my ($data, $response, $protocol) = @_; 
    print $fh $data; 
}); 
close $fh; 

और अगर आकार महत्वहीन है (और हैशिंग किसी अन्य तरीके से किया जाता है) तुम सिर्फ करने के लिए आपके ब्राउज़र पूछ सकते इसे सीधे स्टोर करें:

my $req = HTTP::Request->new(GET => $uri); 
$res = $ua->request($req, $filename); 

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