更新ファイルをダウンロードで提供したいことが時折あります。個別に強制ダウンロードを設定するのはめんどうなのでダウンロード専用フォルダというのを作ってみました。この中にファイルを置くかリンクするだけでクリック一発!、そのファイルを強制ダウンロードさせることができます。ファイルをダウンロードで提供したいということが時折ある。写真などの画像ファイルについてはいちいち面倒をみなくてもブラウザの右クリックで「画像(あるいはリンク先)をファイルに保存する」などで簡単にできるが、プログラムファイルについてはそうはいかない。ダウンロードが容易かどうかというだけの問題ではなく、phpやperlなどのcgiプログラムファイルについてはダウンロード以前に実行されてしまい、その実行結果しか保存されない。場合によってはダウンロードだけさせてそのファイルを実行させたくない場合もあり、その場合強制ダウンロードを設定しなくてはならないが、都度.htaccessなどを編集して設定するのもこれまためんどうだし、そのファイルを表示と兼用している場合はそれもできない。そのためファイルを.zipや.tar、.tgzなどでアーカイブしておくことになるのだが、やっぱりこれもめんどう。(不精の極みと言われれば決して反論はいたしませんが。)そこでダウンロード専用フォルダというのを設置して、その中のファイルはとにかく強制ダウンロードさせるようにしてみた。実はホームページを担当している同期会のサイトには数千の写真や資料があり、それのダウンロード用にはWebShareというHTTPで接続できるファイルブラウザを導入しているが、それほどでもなく数十程度のファイルならダウンロード専用フォルダで充分だろうと思った。ダウンロード専用フォルダをつくるさっそくダウンロード専用フォルダを作りましょう。ダウンロード用スクリプトを書くファイル名を表示してクリックでダウンロードするようphpスクリプトを書きましょう。してこのフォルダに置きましょう。...とたったこれだけ。ダウンロードさせたいファイルをここに置くかリンクするだけ。フォルダに分けて入れてもいいしフォルダをリンクしてもいい。上記ダウンロード専用スクリプトもここから生で(アーカイブされずに)ダウンロードできます。他にお薦めのがいくつか置いてあります。気が向いたらどうぞ覗いてみてください。(表示はapacheのインデックス風にしてみました。)ちょっと欠点は今のところまだダウンロードの中断、再開には対応していません。→いちおう対応してみました。(2013年2月3日)とまあ今回はこんな方法で落ち着いたのだが、途中検討したことも参考として記載しておこう。ブラウザは主にFirefox10での話。すべてのブラウザで試すほどの元気はなし。基本的なやりかたの検討いくつかの方法が考えられるが、なるべく簡単なやつから試していく。最初に検討したのは.htaccessにすべてのファイルを強制ダウンロードするようにヘッダーを仕掛けておき、apacheのIndex機能でファイルリストを表示する方法。試せるが試して即ボツ。attachment"を使用。Indexを表示するたびに.htaccessへのアクセスは禁止されているとかいったエラーを吐く。自分でアクセスしておいてなんなんだ。簡単なファイルの説明などを表示したいがそれができない。各ブラウザでいろんなファイルを試しているうち画像ファイル(写真)によっては強制ダウンロードが効かず表示されてしまう場合がある。(これについては後述。次に上記の.htaccessの強制ダウンロード用ヘッダーの設定はそのまま使ってインデックスはphpプログラムで行い、単なるリンクでポイントしてあとはapacheにダウンロード処理を任せる方法。(1)と同様に一部の画像がダウンロードされずに表示されてしまう現象が起こる。ダウンロードフォルダ内にさらにフォルダを作った場合、そのフォルダにも同様にインデックスプログラムを置いていかなくてはいけない。初期のダウンロードさせたいファイルを置くだけでという指針に反するし、めんどい。内部にさらにフォルダは作らないことにすればいいのだが、作りたくなるかもしれない。インデックスプログラムでインデックス(ファイルリスト)とダウンロード処理を両方やってしまう。試した範囲ではどのファイルも問題なく強制ダウンロードできる。使い方はファイルやフォルダ、あるいはそのリンクをおくだけ。今後も含めていろんな要求には最も柔軟にこたえられる。これを使って普通なら表示されてしまうファイルをダウンロードさせるリンクなども簡単に設置可能。...というわけで、今回は(3)の方法を採用したのでした。.htaccessによる方法がうまくいかなかったわけ最初最も簡単な方法としてダウンロード用フォルダの.htaccessに、全てのファイルでダウンロード指定のヘッダーを出力するように指定する方法を試した。インデックスはApacheのIndex機能を使えばよい。attachmentこれだけでいいはず。ところが、一部の画像ファイル(写真)がそのまま表示されてしまいダウンロードにならない。当初その原因がまったくわからなかった。application/force-downroadといった存在しないファイルタイプを指定してみたりする手法が流行ってしまったようだ。再生アプリケーションがなければダウンロードになるということなのだが...。当初私もよくわからないままこれらもやってはいた。この現象をじっくり調べようと別の日に試してみると、再現されない。そのまま表示されていたファイルもちゃんとダウンロードされる。ははん、キャッシュだな。実は、ダウンロードさせるようなファイルはほとんど更新などしないものだから、キャッシュコントロールなどはいらないと思ってやっていなかった。上流の.htaccessで画像ファイルなどについては表示スピードを上げるためにわざわざキャッシュするように指定している。