HOWTO · PHP

PHP でファイルを強制的にダウンロードする

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

このページの内容

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

PHP でファイルを強制的にダウンロードする

このプロセスには 2つのステップが必要です。

  1. 保護したいファイルを処理するための PHP ファイルを作成します。
  2. 表示されるページの HTML 内にその PHP ファイルの関連性を追加します。

サーバーにファイルをアップロードした後、テキストエディタで PHP ドキュメントを作成します。たとえば、sample.pdf をオンラインで表示する代わりに強制的にダウンロードする場合は、次のようなスクリプトを作成します。

<?php
header("Content-disposition: attachment; filename=sample.pdf");
header("Content-type: application/pdf");
readfile("sample.pdf");
?>

PHP のコンテンツタイプ参照は重要です。保護しているのはファイルの MIME タイプです。たとえば、代わりに MP3 ファイルを保存した場合は、application / pdf をオーディオ MPEG に置き換える必要があります。

PHP でファイルをダウンロードする

通常、画像、zip ファイル、PDF ドキュメント、exe ファイルなどをダウンロードするために PHP などのサーバー側スクリプト言語を使用する必要はありません。このタイプのファイルがアクセス可能なパブリックフォルダーに保存されている場合は、簡単に作成できます。そのファイルを指すハイパーリンク。ユーザーがリンクをクリックするたびに、ブラウザーはそのファイルを自動的にダウンロードします。

<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>

readfile() 関数

PHP の readfile() 関数を使用して、画像やその他のファイルタイプをユーザーのハードドライブに直接ダウンロードするように強制できます。ここでは、ユーザーがマウスを 1 回クリックするだけで、ブラウザから画像ファイルをダウンロードできる簡単な画像ギャラリーを作成しています。image-gallery.php というファイルを作成し、その中に次のコードを入れましょう。

 	<!DOCTYPE html>
<html lang="en">
<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>
<body>
    <?php
    // Array containing sample image file names
    $images = array("hello.jpg", "resampled1.jpg");
    
    // Loop through array to create image gallery
    foreach($images as $image){
        echo '<div class="img-box">';
            echo '<img src="/examples/images/' . $image . '" width="200" alt="' .  pathinfo($image, PATHINFO_FILENAME) .'">';
            echo '<p><a href="/examples/php/download.php?file=' . urlencode($image) . '">Download</a></p>';
        echo '</div>';
    }
    ?>
</body>
</html>

上記のサンプルプログラムをよく見ると、ファイルにつながるダウンロードリンクが見つかります。URL には、クエリ文字列として画像ファイル名も含まれます。また、PHP の urlencode() 関数を使用して画像のファイル名をエンコードし、ファイル名に安全でない URL 文字が含まれている可能性があるため、URL パラメーターとして安全に渡すことができるようにしました。

これが"download.php"ファイルの完全なコードで、画像のダウンロードを強制します。

<?php
if(!empty($_GET['file'])){
    $fileName = basename($_GET['file']);
    $filePath = 'files.txt/'.$fileName;
    if(!empty($fileName) && file_exists($filePath)){
        // Define headers
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$fileName");
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: binary");
        
        // Read the file
        readfile($filePath);
        exit;
    }else{
        echo 'The file does not exist.';
    }
}
    } else {
        die("Invalid file name!");
    }
}
?>

同様に、Word Doc、PDF ファイルなどの他のファイル形式を強制的にダウンロードできます。上記の例の正規表現では、名前がピリオド(.)で開始または終了するファイルは許可されていません。たとえば、hello.jpeg や resampled1.jpeg、myscript.min.js などのファイル名は許可しますが、hello.jpeg. や .resampled.Jpeg. は許可しません。