この記事需要無いかも(笑)
CSVとかZIPファイルをリンク先に設定するとブラウザで開かずにダウンロードが開始します。
画像やPDFのをリンク先に設定した場合は、リンクをクリックするとそのままブラウザで開きます。
画像やPDFの場合もダウンロード出来ないかなって思ったらPHPで簡単に出来ました。
画像とかPDFファイルをリンクで開いたときPHPでダウンロードさせる方法
// 1.ファイルを指定
$file = "sample.pdf";
// 2.コンテンツタイプを「ダウンロード」にする
header('Content-Type: application/force-download');
// 3.ファイルサイズを取得して設定する
header('Content-Length: '.filesize($file));
// 4.ダウンロードする「ファイル名」を指定する。
header('Content-Disposition: attachment; filename="'.$file.'"');
// 5.ファイルを読み込む
readfile($file);
上記PHPのファイル名をdl.phpとしましょう。
リンク元ページで、
<a href="/sample/dl.php">ダウンロード</a>
のようにリンクを書くと、リンクをクリックしたときに「sample.pdf」がダウンロードされます。
サンプルコードの解説
コード内の 1. でダウンロードするファイルを指定します。
サンプルコードではファイル名だけ書いていますが、dl.phpと同じディレクトリにダウンロードファイルを置いたからです。
別ディレクトリにダウンロードファイルを設置した場合はパスも指定しましょう。
2. の Content-Type というのは、HTTP通信で何をサーバーから返してもらうかを定義するものです。
通常のWEBページを開く場合は text/html が設定されます。
これを application/force-download にすると、ダウンロードになります。
3. はレスポンスデータのサイズを指定します。
ファイルをダウンロードする場合は、ダウンロードするファイルのサイズを指定します。
4. はダウンロード時のファイル名を指定します。
1.でもファイル名を指定していましたが、1はどのファイルをダウンロードするか指定し、4.は何という名前でダウンロードするかを指定します。
そして、5.でファイルを読み込みます。
この5.ですが、ファイルサイズが大きいとサーバーのメモリがパンクするようです。
readfile() がファイル内容をいったんメモリに全て展開する関数だからです。
ちゃんと解決している記事がありましたのでそちらをどうぞ。
まとめ
画像やPDFをダウンロードさせたい場面てあるかどうか分かりませんが、Content-Typeを application/force-download にすることで対応できます。
その場合は、Content-Lengthでファイルサイズを指定することと、Content-Dispositionでダウンロードファイル名を指定することを忘れずに。
ファイルの読み込みは readfile() でなくても読み込めればOKです。
ただでかいサイズのファイルをダウンロードする場合はメモリが溢れる危険もあるので対策をしっかりしてください。










コメント