
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第18回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回はファイルアップロードに関する問題です。フォームの設定、アップロードされたファイルの取り扱い、複数ファイルの受け取り方法など、PHPでファイルを安全に扱うために押さえておくべきポイントが問われます。実務にも直結する重要な知識なので、しっかり押さえていきましょう!
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
ファイルアップロード に関する説明の中で、誤っているものを1つ選びなさい。
(1)
PHP でファイルアップロードをする場合、HTML の form には必ず「enctype=”multipart/form-data”」「method=”POST”」を指定する必要がある。
これらを忘れると、ファイルを取得する事ができない。
そのため、以下の HTML
<form action="./sample.php" method="POST">
<input name="f" type="file" />
<button>upload</button>
</form>
をブラウザで閲覧して以下のコード
var_dump($_FILES);
を実行すると、結果は次のとおりとなる。
array(0) {
}
(2)
PHPでファイルアップロードされた時に、アップロードされたファイルがサーバー上で保存されているテンポラリファイルの名前は
$_FILES[‘{form の name の値}’][‘tmp_name’]
に入っている。
そのため、アップロードされたファイルを新しい位置に移動する move_uploaded_file() 関数の第一引数として適切に使う事ができる。
そのため、以下のHTML
<form action="./sample.php" method="POST">
<input name="f" type="file" />
<button>upload</button>
</form>
をブラウザで閲覧して以下のコード
var_dump( $_FILES['f']['tmp_name'] );
var_dump( is_readable($_FILES['f']['tmp_name']) );
を実行すると、結果は次のとおりとなる。(ファイル名は実行毎に変わる)
string(14) "/tmp/php0stFZs"
bool(true)
(3)
PHPでファイルアップロードされた時に、クライアントマシンの元のファイル名は
$_FILES[‘{form の name の値}’][‘name’]
に入っている。
そのため、アップロードされたファイルを新しい位置に移動する move_uploaded_file() 関数の第二引数として適切に使う事ができる。
そのため、以下の HTML
<form action="./sample.php" method="POST">
<input name="f" type="file" />
<button>upload</button>
</form>
をブラウザで閲覧して以下のコード
var_dump($_FILES['f']['name']);
var_dump(is_readable($_FILES['f']['name']));
を実行すると、結果は次のとおりとなる。
string(8) "exam.txt"
bool(true)
(4)
PHP で複数のファイルをアップロードする時には、form に複数の「type=”file”」が、異なる name アトリビュート値 (または配列) であれば受け取る事ができる。
そのため、以下の HTML
<form action="sample.php" enctype="multipart/form-data" method="POST">
<input name="userfile[]" type="file" />
<input name="userfile[]" type="file" />
<input name="file_1" type="file" />
<input name="file_2" type="file" />
<button>Submit</button>
</form>
をブラウザで閲覧して以下のコード
var_dump($_FILES['userfile']['tmp_name']);
var_dump($_FILES['file_1']['tmp_name']);
var_dump($_FILES['file_2']['tmp_name']);
を実行すると、結果は次のとおりとなる。(ファイル名は実行毎に変わる)
array(2) {
[0]=>
string(14) "/tmp/phpdmFh86"
[1]=>
string(14) "/tmp/phpBOFw0X"
}
string(14) "/tmp/phpZP2LSO"
string(14) "/tmp/php3GG1KF"
解説
選択肢1の解説
正しいです。
フォームに enctype=”multipart/form-data” と method=”POST” を指定しないと、ファイルは送信されません。この設定がない場合、$_FILES 配列は空になります。
選択肢2の解説
正しいです。
$_FILES[‘f’][‘tmp_name’] にはアップロードされたファイルの一時ファイルの名前が格納されます。これを move_uploaded_file() に渡してファイルを指定の場所に移動できます。
選択肢3の解説
誤り です。
$_FILES[‘f’][‘name’] はファイル名ですが、それをそのまま move_uploaded_file() の第二引数に使うことは適切ではありません。ファイルの保存先パスを明示的に指定する必要があります。
選択肢4の解説
正しいです。
複数のファイルをアップロードする際には、name 属性を配列(userfile[])として設定することで、複数のファイルを受け取ることができます。各ファイルに対応する tmp_name を確認できます。
正解選択肢
以上より選択肢3が正解となります。
他の問題へ
模擬問題(1)インストール
模擬問題(2)変数の型
模擬問題(3)クラス
模擬問題(4)メソッドその1
模擬問題(5)メソッドその2
模擬問題(6)リファレンス
模擬問題(7)名前空間
模擬問題(8)エラー
模擬問題(9)定義済みのインターフェイスとクラスおよび SPL インターフェイス
模擬問題(10)SPL
模擬問題(11)定義済の変数
模擬問題(12)PHP7.0.xからPHP7.1.xへの移行
模擬問題(13)可変変数
模擬問題(14)PHP7.3.xからPHP7.4.xへの移行
模擬問題(15)PHP7.4.xからPHP8.0.xへの移行
模擬問題(16)制御構造
模擬問題(17)XSS(クロスサイトスクリプティング)
模擬問題(18)ファイルアップロード
模擬問題(19)推測困難なトークン
模擬問題(20)セッション
模擬問題(21)PHP のメモリ消費
模擬問題(22)関数その1
模擬問題(23)関数その2
模擬問題(24)関数その3
模擬問題(25)関数その4
模擬問題(26)関数その5
模擬問題(27)関数その6
模擬問題(28)関数その7
模擬問題(29)関数その8
模擬問題(30)関数その9
コメント