松本 (2011年2月 2日 14:01) ソフトウエア開発部 / PHP
みなさん、こんにちは。
PHPでファイルをダウンロードするプログラムを実装する際、 設定に注意が必要な点について、備忘録も兼ねてまとめてみましたので、 紹介します。
ダウンロードのプログラムは、 該当ファイルの内容を取得して、 echo で書き出すという、オーソドックスな処理です。
1) php.iniファイルにて、「output_buffering」を「On」にする。
output_buffering = Onにしないと、 ファイルの内容がブラウザに書き出されてしまいます。 PDFファイル等を読み込んだ際、 画面にバイナリの文字列が並んでしまったら、この設定を確認しましょう。
2) "Content-disposition: attachment; filename=[ファイル名]" をヘッダー情報として設定する。
PHPでは、ファイル内容を echo で書き出す前に、以下のように書けば良いです。
header("Content-disposition: attachment; filename=[ファイル名]");
3) 2)で設定するファイル名は、Shift-JISにする。
ファイル名が日本語の場合、IEでは、 文字コードがShift-JISでないと文字化けしてしまうので、 ファイル名をShift-JISに変換してから、セットすると良いでしょう。
今回は、Linuxのサーバだったので、 ダウンロードしたいファイル名は英語にしておき、 上記の[ファイル名]の部分を、Shift-JISに変換した日本語名に設定することで、 日本語のファイル名として、ダウンロードできるようにしました。
4) 環境がSSL通信をしている場合は、 プログラムの始めに、「session_cache_limiter('public');」を設定する。 または、「header("Cache-Control: public");」と 「header("Pragma: public");」を設定する。
これは、SSL通信を行っていて、「session_start()」をしているページの場合に 設定が必要です。
3)と同じく、IEの場合のみのようですが、 2)を設定していたり、 「Cache-Control:no-cache」ヘッダーなどを使用している場合、 「session_start();」をする前に、「session_cache_limiter('public');」を設定しないと、 ダウンロードができません。
<参考> 「Content-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題」
「session_cache_limiter('public');」の変わりに、 上記のようにheaderでのキャッシュの設定を行っても、ダウンロードできました。
※「session_start();」をしていなければ必要ありません。
【PHP】ファイルダウンロードプログラム作成時の注意点
松本 (2011年2月 2日 14:01)
ソフトウエア開発部 / PHP
みなさん、こんにちは。
PHPでファイルをダウンロードするプログラムを実装する際、
設定に注意が必要な点について、備忘録も兼ねてまとめてみましたので、
紹介します。
ダウンロードのプログラムは、
該当ファイルの内容を取得して、
echo で書き出すという、オーソドックスな処理です。
1) php.iniファイルにて、「output_buffering」を「On」にする。
output_buffering = Onにしないと、
ファイルの内容がブラウザに書き出されてしまいます。
PDFファイル等を読み込んだ際、
画面にバイナリの文字列が並んでしまったら、この設定を確認しましょう。
2) "Content-disposition: attachment; filename=[ファイル名]" をヘッダー情報として設定する。
PHPでは、ファイル内容を echo で書き出す前に、以下のように書けば良いです。
header("Content-disposition: attachment; filename=[ファイル名]");3) 2)で設定するファイル名は、Shift-JISにする。
ファイル名が日本語の場合、IEでは、
文字コードがShift-JISでないと文字化けしてしまうので、
ファイル名をShift-JISに変換してから、セットすると良いでしょう。
今回は、Linuxのサーバだったので、
ダウンロードしたいファイル名は英語にしておき、
上記の[ファイル名]の部分を、Shift-JISに変換した日本語名に設定することで、
日本語のファイル名として、ダウンロードできるようにしました。
4) 環境がSSL通信をしている場合は、
プログラムの始めに、「session_cache_limiter('public');」を設定する。
または、「header("Cache-Control: public");」と
「header("Pragma: public");」を設定する。
これは、SSL通信を行っていて、「session_start()」をしているページの場合に
設定が必要です。
3)と同じく、IEの場合のみのようですが、
2)を設定していたり、
「Cache-Control:no-cache」ヘッダーなどを使用している場合、
「session_start();」をする前に、「session_cache_limiter('public');」を設定しないと、
ダウンロードができません。
<参考>
「Content-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題」
「session_cache_limiter('public');」の変わりに、
上記のようにheaderでのキャッシュの設定を行っても、ダウンロードできました。
※「session_start();」をしていなければ必要ありません。