【PHP】$_FILESを使ってファイルのアップロード【基本と応用例】
$_FILESとは?
PHPの$_FILES
は、フォームを介して送信されたファイルを処理するためのスーパーグローバル変数です。HTMLの<input type="file">
を使用してファイルをアップロードすると、PHPの$_FILES
を使ってそのファイル情報にアクセスできます。
基本的なファイルアップロード
単一のファイルをアップロードする基本的な方法を紹介します。
HTMLフォーム
<form action="upload.php" method="post" enctype="multipart/form-data">
ファイルを選択: <input type="file" name="uploadFile">
<input type="submit" value="アップロード">
</form>
PHPスクリプト (upload.php)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["uploadFile"])) {
$uploadDir = "uploads/";
$uploadFile = $uploadDir . basename($_FILES["uploadFile"]["name"]);
if (move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $uploadFile)) {
echo "ファイルが正常にアップロードされました。";
} else {
echo "アップロードに失敗しました。";
}
}
複数ファイルのアップロード
複数のファイルを一度にアップロードする場合の方法を紹介します。
HTMLフォーム
<form action="multi_upload.php" method="post" enctype="multipart/form-data">
ファイルを選択: <input type="file" name="uploadFiles[]" multiple>
<input type="submit" value="アップロード">
</form>
PHPスクリプト (multi_upload.php)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["uploadFiles"])) {
$uploadDir = "uploads/";
foreach ($_FILES["uploadFiles"]["tmp_name"] as $key => $tmpName) {
$uploadFile = $uploadDir . basename($_FILES["uploadFiles"]["name"][$key]);
if (move_uploaded_file($tmpName, $uploadFile)) {
echo $_FILES["uploadFiles"]["name"][$key] . " がアップロードされました。<br>";
} else {
echo $_FILES["uploadFiles"]["name"][$key] . " のアップロードに失敗しました。<br>";
}
}
}
ファイルのバリデーション
ファイルのバリデーションを行うことで、不正なファイルのアップロードを防げます。
サイズ制限
$maxFileSize = 2 * 1024 * 1024; // 2MB
if ($_FILES["uploadFile"]["size"] > $maxFileSize) {
echo "ファイルサイズが大きすぎます。";
}
許可されたファイルタイプのチェック
$allowedTypes = ["image/jpeg", "image/png", "image/gif"];
if (!in_array($_FILES["uploadFile"]["type"], $allowedTypes)) {
echo "許可されていないファイルタイプです。";
}
セキュリティ対策
ファイルアップロードにはセキュリティリスクが伴います。以下の対策を講じましょう。
- 拡張子のチェックを行う
- ファイルのMIMEタイプをチェックする
- アップロードディレクトリを
chmod 755
にする - アップロードファイルの名前を変更する
画像の処理
アップロードした画像を加工する方法を紹介します。
画像のリサイズ
function resizeImage($source, $destination, $width, $height) {
list($origWidth, $origHeight) = getimagesize($source);
$image = imagecreatefromjpeg($source);
$newImage = imagecreatetruecolor($width, $height);
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $origWidth, $origHeight);
imagejpeg($newImage, $destination);
}
アップロードしたファイルの管理
アップロードされたファイルを整理し、削除する方法を紹介します。
ファイルの一覧取得
$files = scandir("uploads/");
foreach ($files as $file) {
if ($file !== "." && $file !== "..") {
echo "<a href='uploads/$file'>$file</a><br>";
}
}
ファイルの削除
if (isset($_POST["deleteFile"])) {
$fileToDelete = "uploads/" . $_POST["deleteFile"];
if (file_exists($fileToDelete)) {
unlink($fileToDelete);
echo "削除しました。";
}
}
総合的なサンプルコード
以上の内容を組み合わせたサンプルコードを示します。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
<input type="submit" value="アップロード">
</form>
適切なバリデーションやセキュリティ対策を施したファイルアップロードシステムを構築しましょう。