トランスビット
トランスビットの開発ノート Webサイト制作に役立つTipsやトラブルシューティングなどの備忘録

PHPでリンククリックしてファイルをダウンロード

今日、きゅうりを一本収穫しました。つやつやです。
「あ、今日できてる!」とか「明後日には食べれるかな~」とか言ってる今が一番楽しいです。
ちなみに去年は1苗から200本近く採れてしまい、配布や消費に勤しみました。まさにきゅうり地獄。
トランスビットの外の人は、「きゅうりの食べ過ぎで体が緑色になった気がする」とか言っていましたが……おかしいな。
補色の関係にあるトマトもたくさん食べたのに。

ということで、今日はブラウザでの収穫作業の話です。

画像に貼ったリンクをクリックすると、通常ブラウザで画像が開いてしまいます。
開かずにダウンロードさせるので思いつく方法といえば、右クリックメニューから「名前をつけてリンク先を保存」とかかな。
リンククリックで直接ダウンロードさせたい場合、PHPで画像をDLさせることができます。
download.phpを下記のような内容で作っておき、ダウンロードさせたいリンクにdownload.phpを指定&URLクエリストリングで画像ファイル名とかを渡してやれば、再利用可能でラブリーというわけです。

//ファイルのパス
$fpath = $_GET["ps"];
$fpath = $fpath.'.jpg';

//ファイル名
$fname = $_GET["fn"];
$fname = $fname.'.jpg';

//IE空DL対策
$data = file_get_contents($fpath) or die('ERROR:cannot get');

//いらんかも
mb_output_handler($fpath);// 文字化け対策
mb_output_handler($fname);// 文字化け対策

header('Cache-Control: public');
header('Pragma: public');
header('Content-Type:application/octet-stream');
header('Content-Disposition: attachment; filename="'. rawurlencode($fname) .'"');// 文字化け対策
header('Content-Length: '. strlen($data));// IE空DL対策。

ob_end_clean(); // これがないとファイルが破損して悲しいことになる
readfile($fpath);

今回は、WordpressでLitebox的なプラグインを使っていたので、URLに[.jpg]が入っていると問答無用で別ウインドウが開いてしまうため、拡張子を削ったファイルのパスをURLに渡しました。ついでにファイル名用の文字列(日本語・文字化け注意)も渡してます。それがpsとfnですね。拡張子は必要だから後で両方に付け足し。

いやー……久しぶりにIEに滅多打ちにされました。一時はどうなることかと。
参考にしたサイトはこちら。いつもながら、えらい人たちに助けられてます。
PHPのファイルダウンロードでファイル破損を防ぐ方法!
PHPでダウンロードしたファイルが0kbになってしまいます

Filed under: