システム開発ブログ

【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();」をしていなければ必要ありません。

システムのトラブル解決を承ります。すぐにシステムリフォームを体験できますシステム診断・システムリフォームのお申し込みはこちらから。

システム開発ブログ

Twitterでilovex_officialをフォローしてください

最近の記事

カテゴリー

部署

月別アーカイブ

以前の部署別ブログ

ページのトップ