はじめに
ファイルアップロードを行うとき、<form> タグに enctype="multipart/form-data" を指定しないと正しく動作しません。この属性がないと、ブラウザはファイルデータを送信できず、$_FILES 配列も空のままになります。
目次
🔰 ファイルアップロードの基本構造
ファイルをアップロードする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 の指定漏れは意外と多いバグ。
特に複数フォームが混在するシステムでは、「テキストだけ送れてファイルが送れない」ケースはこの設定忘れが原因なことが多いです
