サンプル集  >  other  >  ダウンロード
ダウンロード
2009/06/16

Webページでファイルをダウンロードさせたい場合、a タグで直接ファイルを指定すると、リンクをクリック時にダウンロードする事ができます。 でも、HTMLファイルや phpファイルをリンク先に指定した場合、リンクをクリックしてもダウンロードにはならずページ遷移になります。 phpを使って、phpやhtmlなどのファイルをダウンロードさせる事はできました。(PHPサンプル集 - ダウンロード

phpが無い場合はどうしようもないのでしょうか。

apache の .htaccess ファイルを使ったらできるかもしれません。

◆環境
OS Windows XP Professional Version 2002 Service Pack 2
MySQL 14.12 Distrib 5.0.27, for Win32 (is32)

.htaccess ファイルはフォルダ毎に設定できるようです。 試しに、.htaccess ファイルを作ろうとしたところエラーが出ました。 Windows だと、.(ピリオド)以降は拡張子と認識されるのでファイル名を指定して下さいと言われました。

アクセスファイル名は httpd.conf で変更できるみたいなので修正します。 今回は、dir.htaccess という名前にしてみました。 httpd.conf の最後に以下を追記します。

AccessFileName dir.htaccess

<Files dir.htaccess>
Order allow,deny
Deny from all
</Files>

以下の行を変更します。

#    AllowOverride None
    AllowOverride FileInfo

dir.htaccess ファイルは以下の通りです。

dir.htaccess
1: 
2: 
3: 
<Files "test.html">
  ForceType "application/octet-stream;"
</Files>

ダウンロードテスト用のHTMLです。

test.html
1: 
2: 
3: 
4: 
5: 
<html>
<body>
<a href="test.html">ダウンロード!</a>
</body>
</html>

apache を再起動し、apache 経由で test.html へアクセスします。

・・・変化なし。 そもそも ForceType って何でしょうか? 調べたら以下のような説明を見つけました。

ForceType ディレクティブは、そのディレクトリ以下にあるすべてのファイルが指定された MIME タイプで提供するよう HTTPヘッダに明示する。

例を見ると、どうも " (ダブルクォート)とか ; (セミコロン)は要らないみたいです。 また Files もいらない模様です。 dir.htaccess を修正します。

dir.htaccess
1: 
ForceType application/octet-stream

修正後、再度 test.html へアクセスしましたが変化なしでした。 試しに拡張子が exe へリンクした a タグを入れてみます。

test.html
1: 
2: 
3: 
4: 
5: 
6: 
<html>
<body>
<a href="test.html">ダウンロード!</a><br />
<a href="abc.exe">ダウンロード2</a>
</body>
</html>

abc.exe ファイルを適当に作ってリンクを押したら、ダウンロードのダイアログが出ました。

拡張子が exe のファイルはダウンロードになりました。 ForceType でそのフォルダ内のファイルは全て MIMEタイプに application/octet-stream を指定するようにしているつもりなので、 ちゃんと dir.htaccess が動いていれば問題ないはずです。

原因は以下のどれかでしょうか。

  1. dir.htaccess が認識されていない。
  2. AllowOverride の記述が間違っている。
  3. dir.htaccess の記述が間違っている。
  4. MIMEタイプ application/octet-stream の記述が間違っている。
  5. MIMEタイプ application/octet-stream はダウンロードにならない MIMEタイプ。

まずは、http.conf に書いた AccessFileName が機能しているのかを調べます。 と言っても書く場所があってるかどうかを確認するだけですが・・・

調べた感じだと、特に書く位置に指定はないようです。

次は AllowOverride の記述をチェックします。 FileInfo を指定していて、これは ForceType の使用を許可するので問題無いはずです。 ・・・と思ったら、この要素は Directory に囲まれていました。 / の Directory に含まれる AllowOverride は None になっていました。 これが原因でしょうか。 / の Directory に含まれる AllowOverride も FileInfo にしてみます。

再度 test.html へアクセスしてみましたがダメでした。 AllowOverride は正規表現無しの <Directory> セクションで有効なようなので、httpd.conf の下に追記してみます。

<Directory "C:\htmlDoc\other\P0\W3\P033\src">
    AllowOverride FileInfo
</Directory>

これでもだめでした。 試しにリンクを右クリックして名前を付けて保存でダウンロードできるかやってみました。

すると、exe と html で認識されている種別が違いました!

exe はファイルの種類が「Binary File」となっています。

html はファイルの種類が「Firefox Document」と出ました。 ちゃんと設定が出来ていればこれは Binary File になるはずだと思います。 ちなみに、dir.htaccess を削除したらどうなるのでしょうか?

結果は、Firefox Documentでした。変化なしですね。

dir.htaccess の MIMEタイプを image/gif にしてアクセスしたらエラーになりました!

画像ファイル "http://localhost/other/P0/W3/P033/src/test.html" は壊れているため、表示できませんでした。

ということは dir.htaccess は効いてるってことでしょうか!? とりあえず application/octet-stream に戻します。 ・・・元に戻りませんね。。。

謎ですね。test.html をコピーして test2.html を作ってアクセスしたら Webページが開きました。 abc.exe をダウンロードしようとしたら、これも画像として認識されてしまいました。。。

状況としては、あるタイミングで image/gif の ForceType が適用されて、その時点で存在した test.html、abc.exe は 画像として認識されるようになったけど、その後できた test2.html はその影響をうけなかったって感じです。

IE でやるとまた動きが違いました。色々調べたところ、Firefox のキャッシュをクリアしたら修正が反映されました。

どうやら application/octet-stream が適用されていたようで、test.html へアクセスするとダウンロードが出るようになりました。

途中で足した、<Directory "C:\htmlDoc\other\P0\W3\P033\src"> を削除しても動作は変わりませんでした。 不要なものは削除します。

結局、設定は間違ってなくてキャッシュが原因でした。

試しに、php のソースがあるフォルダに dir.htaccess を置いてみたらちゃんとダウンロードが出るようになりました!!

でもこの方法だと全部のソースフォルダに dir.htaccess を置かなければなりませんね。 Directory と組み合わせたらどうかなと思い試してみました。

早速、httpd.conf に追記します。

<Directory ~ ".*/src">
    ForceType application/octet-stream
</Directory>

apache を再起動して試したみたら上手くいきました! src フォルダ配下の資源は全てダウンロードが開くようになりました。

dir.htaccess ファイルだけダウンロードできませんでした。。。 設定ファイルだから特殊な扱いなのでしょうか?

▲ PageTop  ■ Home


Copyright (C) 2012 ymlib.com