10

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(このファイルが見つかった場所)をファイル名とハッシュとともにデータベースに一度にアップロードします。

4

2 に答える 2

10

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);
于 2012-12-06T09:49:35.937 に答える
5

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 は独自のブラウザを使用するため、LWP::Simple の getstore では無視されるからです。

また、より安全な open の 3 つのパラメータ バージョンを使用します。

別の解決策は、コールバック メソッドを使用して、ダウンロード中にファイルを保存することです。たとえば、大きなファイルを扱っている場合です。ハッシュアルゴリズムを変更する必要があるため、ここではおそらく関係ありませんが、サンプルは次のとおりです。

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);
于 2014-12-06T21:48:12.980 に答える