こんにちは、いつもお読みいただきありがとうございます。
Ken(@gootablog)です。
今回はPHPでファイルをダウンロードする基本的なやり方を書いていきたいと思います。
目次
基本的なダウンロード方法
//ダウンロードをしたいファイル名のパス
$file_name = 'hoge.php'
$file_path = dirname(__FILE__).'/'.$file_name;
//ダウンロード時のファイル名
$download_file_name = 'download.php';
//タイプをダウンロードと指定
header('Content-Type: application/force-download;');
//ファイルのサイズを取得してダウンロード時間を表示する
header('Content-Length: '.filesize($file_path));
//ダウンロードの指示・ダウンロード時のファイル名を指定
header('Content-Disposition: attachment; filename="'.$file_name.'"');
//ファイルを読み込んでダウンロード
readfile($download_file_name);
このスクリプトを実行すればファイルのダウンロードがすぐ開始されます。
ファイルのパス
ファイルのパスを指定する場合は基本は絶対パスで指定するのが良いかと。上記の場合は実行スクリプトとダウンロードするファイルが同じ階層にある場合の書き方です。
Content-Disposition: attachment;
Content-Disposition: attachment;
の後のファイル名はダウンロード時に変更したい場合は、そのファイル名を書いてください。filename
を書かないとこのスクリプトを実行したファイル名でダウンロードされてしまうので注意です。
readfile();
ファイルを読み込んでダウンロードする部分の関数ですが、file_get_contents();
という関数でも実行が可能です。が、この関数はファイルの内容を全て文字列に読み込むので、サイズが大きいファイルの場合時間がかかったりしてしまいます。
なので基本的には、ファイルを読み込んで標準出力に書き出してくれるreadfile();
を使うようにしましょう。
リファレンスのリンク貼っておくので詳しく見たい方は下記リンクから見てみてください。
スクリプトのコピペ(コメントなし)
コメントなしバージョンのスクリプトを記載するので、良ければ使ってください。
$file_name = 'hoge.php'
$file_path = dirname(__FILE__).'/'.$file_name;
$download_file_name = 'download.php';
header('Content-Type: application/force-download;');
header('Content-Length: '.filesize($file_path));
header('Content-Disposition: attachment; filename="'.$file_name.'"');
readfile($download_file_name);
複数のファイルをダウンロードする場合はZipを使う
もし複数のファイルをダウンロードをする場合は、PHPの拡張モジュールのZip Archiveを使いましょう。
詳しい使い方はコチラの記事を参考にしてみてください。