画像URLからクライアントに保存

LWP::Simple
use LWP::Simple;
# 画像のURL
my $image_url = "https://example.jp/img/logo.jpg";
# URLから画像データを取得
my $image_data = get($image_url);
# Content-Dispositionヘッダーを設定
my $filename = "downloaded_image.jpg";
my $disposition = "attachment; filename=$filename";
# HTTPヘッダーを出力
print "Content-Type: application/octet-stream\n";
print "Content-Disposition: $disposition\n\n";
# 画像データを出力
print $image_data;
LWP::UserAgent
use LWP::UserAgent;
# 画像のURL
my $image_url = "https://example.jp/img/logo.jpg";
# UserAgentを作成
my $ua = LWP::UserAgent->new;
# URLからレスポンスを取得
my $res = $ua->get($image_url);
# レスポンスが成功した場合
if ($res->is_success) {
# 画像データを取得
my $image_data = $res->decoded_content;
# Content-Dispositionヘッダーを設定
my $filename = "downloaded_image.jpg";
my $disposition = "attachment; filename=$filename";
# HTTPヘッダーを出力
print "Content-Type: application/octet-stream\n";
print "Content-Disposition: $disposition\n\n";
# 画像データを出力
print $image_data;
} else {
# エラー処理
print "Error: " . $res->status_line . "\n";
}
JavaScriptと併用
# URLから画像データを取得
my $image_data = get($image_url);
# 一時ファイルを作成し、画像データを書き込む
my $tmp_file = "./temp_image.jpg";
open(my $fh, '>', $tmp_file) or die "Could not open $tmp_file: $!";
print $fh $image_data;
close $fh;
# HTMLとJavaScriptを出力
print "Content-type: text/html\n\n";
print <<EOM;
<img id="image" src="./temp_image.jpg">
<button onclick="saveImage()">Save Image</button>
<script>
function saveImage() {
var image = document.getElementById('image').src;
var filename = 'downloaded_image.jpg';
var element = document.createElement('a');
element.setAttribute('href', image);
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
</script>
EOM