[英]Perl & LWP: getstore() will only save a file if I don't specify a directory
[英]perl save a file downloaded by lwp
我使用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;
如果你想知道我為什么不下載所有內容然后解析每個文件和哈希的文件夾,因為我在循環中下載所有這些文件。 在每個循環中,我將相關的源URL(找到此文件的位置)以及文件名和哈希一次性上傳到數據庫中。
從LWP::Simple
嘗試getstore()
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);
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)上設置或獲取了一些設置,它們會在LWP :: Simple的getstore中被忽略,因為它使用自己的瀏覽器。
此外,它使用open的三個參數版本,它應該更安全。
另一個解決方案是使用回調方法並在下載文件時存儲文件,例如,如果您正在處理大文件。 必須更改散列算法,因此它可能與此不相關,但這里是一個示例:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.