【PHP】$_FILESを使ってファイルのアップロード【基本と応用例】

【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>

適切なバリデーションやセキュリティ対策を施したファイルアップロードシステムを構築しましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です