《PHP8上級試験対策》ファイルアップロードと enctype=”multipart/form-data” の関係

  • URLをコピーしました!

はじめに

ファイルアップロードを行うとき、<form> タグに enctype="multipart/form-data" を指定しないと正しく動作しません。この属性がないと、ブラウザはファイルデータを送信できず、$_FILES 配列も空のままになります。

キーワード:enctype / multipart/form-data / $_FILES / $_POST / ファイルアップロード / PHPフォーム送信仕様

目次

🔰 ファイルアップロードの基本構造

ファイルをアップロードするHTMLフォームの正しい記述は次のとおりです👇

<form action="./upload.php" method="POST" enctype="multipart/form-data">
    ファイルをアップロード:
    <input type="file" name="userfile"><br>
    <button>送信</button>
</form>

この enctype=”multipart/form-data” があることで、ブラウザはファイルの**中身(バイナリデータ)**を正しく送信します。

🧩 enctype がない場合の挙動

では、もし enctype を省略するとどうなるでしょう?

<form action="./p110.php" method="POST">
    このファイルをアップロード:
    <input type="file" name="userfile"><br>
    <button>送信</button>
</form>

そして p110.php に以下のコードがあるとします:

<?php
declare(strict_types=1);
error_reporting(-1);
echo "<pre>";
var_dump($_FILES);
var_dump($_POST);

💻 実際の出力(ブラウザによって異なる)

Chromeではこうなったはずです👇

array(0) {
}
array(1) {
  ["userfile"]=>
  string(17) "untitled text.txt"
}

一方、別の環境やブラウザではこう出ることもあります👇

array(0) {
}
array(0) {
}

⚙️ なぜ違いが起きるのか?

ASCIIアート図解で見てみましょう👇

┌─────────────────────────────────────────────────────────┐
│ <form>                                                  │
│  ├── enctype="multipart/form-data"  → ✅ 正しいアップロード │
│  │      ↓                                               │
│  │   ファイルの中身も送信 → $_FILES に格納                   │
│  └── enctype なし → ⚠ ファイル名のみ(ブラウザによる)         │
│         ↓                                                │
│     Chrome等:$_POST["userfile"]="ファイル名"              │  
│     他の環境:送信されない                                  │
└─────────────────────────────────────────────────────────┘
  • 仕様上は「何も送られない」が正しい。
  • しかし、ブラウザ(特にChrome・Safari)は互換性維持のため「ファイル名だけ送信」することがある。

🧠 試験対策ポイント

試験では 「PHP公式仕様に基づく動作」 が基準になります。したがって以下のように覚えましょう👇

項目enctype 指定なしenctype=”multipart/form-data”
ファイル送信内容送られない(ブラウザによりファイル名のみ)ファイルデータが送信される
$_FILES空配列ファイル情報が格納される
$_POST空またはファイル名文字列(ブラウザ依存)他のフォーム値が格納される
試験上の評価❌「動作しない」扱い✅「正しく動作する」扱い

💡 まとめ

  • ファイルアップロードには enctype="multipart/form-data" が必須。
  • これがないと 「ファイルアップロード」は動作しない
  • ブラウザによってはファイル名だけ $_POST に入るが、それは仕様外。
  • 試験では「動作しない」と回答するのが正解。

🪄 補足:実務メモ
実際の現場でも、enctype の指定漏れは意外と多いバグ。
特に複数フォームが混在するシステムでは、「テキストだけ送れてファイルが送れない」ケースはこの設定忘れが原因なことが多いです

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次