例えば、下記のようなスクリプトの場合、一度画像が保存された後、ファイルサイズをを抜き出すようになります。
ダウンロード前に、ファイルサイズをあらかじめ知りたいのですがどのようにしたら良いでしょうか?
use strict;
my $url = "http://img.www.goo.ne.jp/img/gh_logo.png";
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;
use HTTP::Headers;
my $req = HTTP::Request->new(GET => $url);
my $ua = LWP::UserAgent->new;
$ua->agent( 'Mozilla/5.0 (Windows NT 6.0; rv:12.0)' );
$ua->timeout('10');
$ua->max_redirect();
$ua->cookie_jar( HTTP::Cookies->new(
file => '',
autosave => 1,
));
my $res = $ua->request($req, "save.png");
my $file_size = $res->header("content-length");
print $file_size;
use strict;
use warnings;
use feature 'say';
use LWP;
use HTTP::Request;
my $url = shift // die "usage : $0 url";
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0');
$ua->timeout(10);
my $req = HTTP::Request->new( HEAD => $url );
my $res = $ua->request($req);
$res->is_success or die $url, ': ', $res->message;
say '--- HTTP Header';
say $res->header('Content-Type');
say $res->header('Content-Length');
say $res->status_line;
say $res->code;
お礼
まさに、求めていた情報です!ありがとうございます。 ただ、正直、使い方がいまいちよく分かりません。 ':content_cb'のように、’’で囲むような表記は始めてみました。 また、色々調べて見たところ、下記のようにすると動くと思ったのですが、コールバックのサイズが変わってないようでした。 また、もし、元シンプルに、Content-Lengthのみ求めて、あとは通常の制御に戻る方法があれば教えていただければ幸いです。 my $res = LWP::UserAgent->new->get( $uri, ':content_cb' => sub { my ( $chunk, $res, $proto ) = @_; print $wfh $chunk; my $size = tell $wfh; if (my $total = $res->header('Content-Length')){ printf "%d/%d (%f%%)\r", $size, $total, $size/$total*100; }else{ printf "%d/Unknown bytes\r", $size; } }, ':read_size_hint' => 100000000000000000000000000000000000, );