English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、PHPを使用してファイルを強制的にダウンロードする方法を学びます。
通常、あなたはサーバーサイドのスクリプト言語(例えばPHP)を使用して画像、zipファイル、pdfドキュメント、exeファイルなどをダウンロードする必要はありません。このようなファイルがパブリックにアクセス可能なフォルダーに保存されている場合、ファイルへのリンクを作成するだけで十分です。ユーザーがリンクをクリックすると、ブラウザが自動的にファイルをダウンロードします。
<a href="downloads/test.zip">ダウンロードZipファイル</a> <a href="downloads/masters.pdf">ダウンロードPDFファイル</a> <a href="downloads/sample.jpg">ダウンロード画像ファイル</a> <a href="downloads/<a href="downloads\setup.exe">ダウンロードEXEファイル</a>
PDFや画像ファイルへのリンクをクリックしても、それがハードディスクに直接ダウンロードされることはありません。ブラウザでファイルが開かれます。また、ハードディスクに保存することもできます。ただし、デフォルトではzipやexeファイルは自動的にハードディスクにダウンロードされます。
PHPのreadfile()関数を使用して、画像や他のファイル形式をユーザーのハードディスクに直接ダウンロードすることができます。ここでは、ユーザーがブラウザから画像ファイルをダウンロードできるシンプルな画像ライブラリを作成します。
「image」という名前の変数を作成しましょう。-gallery.php”のファイルに以下のコードを入れてください。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Simple Image Gallery/<title> <style type="text/css"> .img-box{ display: inline-block; text-align: center; margin: 0 15px; } </<style> </<head> <?php //サンプル画像ファイル名を含む配列 $images = array("kites.jpg", "balloons.jpg"); //画像ライブラリを作成するために配列を巡ります foreach($images as $image){ echo '<div class="img-box">'; echo '<img src="images/' . $image . '" width="200" alt="' . pathinfo($image, PATHINFO_FILENAME) . '">'; echo '<p><a href="download.html?file=' . urlencode($image) . '">ダウンロード</a></p>'; echo '</div>'; } ?> </<html>
上記のサンプルコードを詳しく見ると、"download.php"ファイルへのダウンロードリンクが見つかります。このURLには、クエリストリングとして画像ファイル名も含まれています。また、PHPのurlencode()関数を使用して画像ファイル名をエンコードし、URLパラメータとして安全に渡すことができます。なぜなら、ファイル名にはURLに不適切な文字が含まれている可能性があるからです。
これは「download.php」ファイルの完全なコードで、画像を強制的にダウンロードするために使用できます。
<?php if(isset($_REQUEST["file"])){ //パラメータを取得します $file = urldecode($_REQUEST["file"]); //URLエンコードされた文字列をデコードします /* ファイル名に無効な文字が含まれているかテストします 例えば、正規表現の「 ../” */ if(preg_match('/^[^.][-a--9_.]+-z]$/i', $file)){ $filepath = "images/" . $file; // ダウンロードプロセス if(file_exists($filepath)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($filepath).'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($filepath)); flush(); //システム出力バッファをクリアします readfile($filepath); die(); } else { http_response_code(404); die(); } } else { die("無効なファイル名!"); } } ?>
同様に、他のファイル形式(例:.doc、.pdfなど)を強制的にダウンロードすることもできます。
上記の例(第8行)内の正規表現は、ドット文字(.)で始まるまたは終わるファイル名を完全に禁止します。例えば、kites.jpgやKites.jpg、myscript.min.jsなどのファイル名を使用できますが、kites.jpg.や.kites.jpgは使用できません。
関連情報を確認してください正規表現のチュートリアルで、正規表現を詳細に学習してください。