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

Muhammad Abubakar 2023年1月30日
  1. PHP でファイルを強制的にダウンロードする
  2. PHP でファイルをダウンロードする
  3. readfile() 関数
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.jpegresampled1.jpegmyscript.min.js などのファイル名は許可しますが、hello.jpeg..resampled.Jpeg. は許可しません。

関連記事 - PHP File