PHP でファイルを強制的にダウンロードする
このチュートリアルでは、PHP でファイルを強制的にダウンロードする方法を学びます。
PHP でファイルを強制的にダウンロードする
このプロセスには 2つのステップが必要です。
- 保護したいファイルを処理するための PHP ファイルを作成します。
- 表示されるページの 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.
は許可しません。