概要

ファイルアップロードは「Web で唯一、バイナリを Body に乗せる仕組み」。普通のフォーム送信 (application/x-www-form-urlencoded) では Body に key=value の文字列しか乗らないが、画像など ファイルを送るときは違うエンコーディング が要る。それが <form enctype="multipart/form-data"> で指定する multipart/form-data。Body を境界線で区切り、各セクションにヘッダ + 中身 (バイナリも OK) を並べる HTTP の特別な書式。

PHP 側にはアップロード情報が $_FILES 連想配列 で届く。$_FILES['avatar']['name'] (元のファイル名)、['tmp_name'] (PHP が一時保存した場所)、['size']['type'] (ブラウザ自己申告 MIME)、['error'] という構造。永続化は move_uploaded_file($tmp, $dest) を使うのが原則 (アップロード由来かを検証する保護付き)。

絶対に手を抜けないのが セキュリティ。「拡張子 / MIME / サイズ」をサーバー側で必ず再検証する。$_FILES['type'] はブラウザの自己申告で信用できないので、finfo_file() で実体から MIME を判定するのが正解。.php など実行可能な拡張子をアップロードさせるのは致命的で、保存ディレクトリは public 領域から分離 し、ホワイトリストで拡張子を絞る。CLI 採点では再現できないため、本章は 概念とドリル無しの座学 に振り切る。

学習目標

ドリル

このチャプターにドリルはありません。

理由: ファイルアップロードは HTML フォーム → HTTP multipart/form-data → PHP の $_FILES という Web ランタイム前提の機能で、本コースの CLI 採点ランナーでは再現できない$_FILES を CLI で擬似的に埋めるスタブは書けるが、move_uploaded_file「本物のアップロード由来のファイルしか動かさない」 ように保護されているため、意味のあるドリルにならない。

代わりに 「概念と落とし穴」 をスライドで頭に入れ、実機 (php -S + ブラウザ) で 任意で試す案内とする。

本物の体験 (任意)

php -S でローカルサーバーを立ち上げてブラウザから試すと、5 分で全体像が掴める。スライド末尾の最小サンプル (form.html + upload.php) を写経して、ブラウザで localhost:8000/form.html を開いて画像を 1 枚アップしてみると分かりやすい。

この章を AI に聞く

  1. 「ch06 — ファイルアップロードの概念」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch06 — ファイルアップロードの概念」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch06 — ファイルアップロードの概念」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch06 — ファイルアップロードの概念」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE