English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP基本教程

PHP上級教程

PHP & MySQL

PHPリファレンスマニュアル

PHP ファイルのダウンロード

このチュートリアルでは、PHPを使用してファイルを強制的にダウンロードする方法を学びます。

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で強制的にダウンロード

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は使用できません。

関連情報を確認してください正規表現のチュートリアルで、正規表現を詳細に学習してください。