HTML5のDOWNLOAD属性を使っている場合に、直リンクを禁止している環境ではうまく動かない問題
HTML5には、リンク先をダウンロードさせる download属性があります。IEでは非対応ですがChromeなどのブラウザでは有効です。このdownload属性を指定することで、画像などのファイルへのリンクが画像を開かずにダウンロードするような動作になるので ファイルの配布などには役立ちます。またdownload=”ファイル名”とすることで、ダウンロードする際のファイル名の指定も行えたりもします。
とても便利な、download属性なのですが。ダウンロードする対象をhtaccessで自分サイトのリファラーがある場合のみダウンロード出来るように直リンク禁止にしている場合に。ダウンロードできなくなる現象があります。どうもdownload属性はリファラーがない状態でダウンロードを試みるようなので リファラーが無いところからのダウンロードを禁止している場合は。ファイルがダウンロードできなくなってしまいます
解決方法
- その1 リファラーが無いアクセスでもダウンロードは可能状況にする
- その2 PHPでファイルをダウンロードするような形式にする
- その3 download属性の利用をやめて、右クリックから保存してもらうようにする
- その4 直リンク禁止を解除する
解決の方法としては、これらの方法がありますが。現実的なのは、PHPでファイルダウンロードするように加工するってものですね。
例えば、download.php にアクセスしたら、そのファイルで指定してあるファイルをダウンロードさせることが出来ます。このままでは ファイルの数の分だけphpファイルを作らなくてはならいのですが。
getパラメータを使って、phpファイルの内容を動的に変えてやれば 一つのphpで処理することが出来ます。
download.php を作る
<?php $dl_link = $_GET["dl"]; $file_name = basename($dl_link); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); print file_get_contents($dl_link);
getパラメータでダウンロードするファイルのパス情報を取得します。
ダウンロードリンクは
- http://freeimage.9-bb.com/download.php?dl=./img/cat1/00246.jpg
とすることで、 dl=値 のところがパラメータとして取得できます。
ダウンロードするものごとに、パラメータのところだけを変えてやれば良いだけです。
パラメータはdownload.phpがあるところからのパスでの指定になります。
プラスアルファで嬉しい事も
今まで直接ファイルへのリンクだったのを、download.phpを経由することでファイルをダウンロードさせる形になっています。また、こちらの方法だと IEでもリンクをクリックするとファイルがダウンロード出来るようになるメリットがあります。
実際にこちらのサイトを作るときにdownload属性の問題に当たり、この方法で解決することが出来ました
COMMENT