はじめに
ファイルアップロードを行うとき、<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
の指定漏れは意外と多いバグ。
特に複数フォームが混在するシステムでは、「テキストだけ送れてファイルが送れない」ケースはこの設定忘れが原因なことが多いです