PHP スーパーグローバル変数-$_FILES
今回はスーパーグローバル変数の「$_FILES」について解説したいと思います。
この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
スーパーグローバル変数 $_FILES とは?
スーパーグローバル変数「$_FILES」はCMSやメールフォームなどでも利用される、画像やファイルをアップロードするための変数です。
$_FILES を利用する
$_FILESを利用するには<input type=”file”>からデータを送信する必要があります。
また<form></form>内に<input type=”file”>を設置しファイルデータを送信するにはformの属性と値に 「enctype=”multipart/form-data”」を記述する必要があるので忘れないようにしてください。
ファイルを送信するためのHTMLは下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>$_FILESの利用</title> </head> <body> <form action="./" method="post" enctype="multipart/form-data"> <input type="file" name="file01"> <input type="file" name="file02"> <input type="submit" value="送信"> </form > </body> </html> |
PHPでデータを受け取る
では、<input type=”file”>から送信されたデータを受け取るスクリプトの解説です。
<input type=”file” name=”****“> name属性の値「****」が$_FILESの添字として利用し$_FILES[‘****‘]と記述することで<input type=”file” name=”****“>から送信されたデータを受け取ることができます。
例1)<input type=”file” name=”data“> → $_FILES[‘data‘]
例2)<input type=”file” name=”file“> → $_FILES[‘file‘]
となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ print_r($_FILES); } ?><!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>$_FILESの利用</title> </head> <body> <form action="./" method="post" enctype="multipart/form-data"> <input type="file" name="file01"> <input type="file" name="file02"> <input type="submit" value="送信"> </form> </body> </html> |
それでは$_FILESから受け取ったデータの中身確認してみます。
受け取ったデータの中身は下記のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Array ( [file01] => Array ( [name] => sample01.jpg [type] => image/jpeg [tmp_name] => /Applications/MAMP/tmp/php/phpQSCWsv [error] => 0 [size] => 13140 ) [file02] => Array ( [name] => test_image02.png [type] => image/png [tmp_name] => /Applications/MAMP/tmp/php/phpi5PBNY [error] => 0 [size] => 23723 ) ) |
<input type=”file” name=”file01″>から送信されたデータを元に解説します。
変数名 | 内容 |
---|---|
$_FILES[‘file01’][‘name’] | アップロードしたファイルのファイル名 |
$_FILES[‘file01’][‘type’] | アップロードしたファイルのMIME |
$_FILES[‘file01’][‘tmp_name’] | アップロードしたファイルの一時保存パス |
$_FILES[‘file01’][‘error’] | エラー内容 |
$_FILES[‘file01’][‘size’] | アップロードしたファイルの容量「単位はバイト」 |
[‘type’]から取得するIMEIとは?
アップロードされるファイルにはJPEGやPNG、PDF、MP3、MOVなど様々なファイルが存在します。
画像のみアップロードを許可するのであれば、アップロードされたファイル[‘type’]からMIMEを取得し、確認、画像形式のMIME以外はエラーとして返すなどの処理を行うことができます。
※厳密にはMIMEを偽装などできるのでMIMEの確認のみバリデーションでは不十分とも言えます。
MIMEタイプ | ファイルの拡張子 |
---|---|
image/jpeg | .jpg 、 .jpeg 、 .jfif 、 .pjpeg 、 .pjp |
image/gif | .gif |
image/png | .png |
application/pdf | |
audio/mpeg | .mpga、.mp2、.mp3 |
text/html | .html、.htm |
video/mpeg | .mpeg、.mpg、.mpe |
video/x-ms-wmv | .wmv |
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx | .docx |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx | xlsx |
[‘tmp_name’]一時保存パスとは?
一時保存パスとは、ファイルをアップロードし指定のディレクトリに保存しますが、その前に仮にデータを保存しています。その保存先のパスが[‘tmp_name’]に格納されています。
任意のディレクトリに保存する際はここから、アップロードしたファイルデータを取得します。
[‘error’]とは?
ファイルをアップロード時に何らかの理由で正常にアップロードできなかった場合、[‘error’]にエラー内容が保存されます。
定数 | 値 | 内容 |
---|---|---|
UPLOAD_ERR_OK | 0 | 成功 |
UPLOAD_ERR_INI_SIZE | 1 | upload_max_filesizeで指定したサイズを超過している |
UPLOAD_ERR_FORM_SIZE | 2 | name=”max_file_size”で指定したサイズを超過している |
UPLOAD_ERR_PARTIAL | 3 | ファイルが破損している |
UPLOAD_ERR_NO_FILE | 4 | 指定したファイルが存在しない |
UPLOAD_ERR_NO_TMP_DIR | 5 | 一時保存用のディレクトリが存在しない |
UPLOAD_ERR_CANT_WRITE | 6 | 保存に失敗 |
UPLOAD_ERR_EXTENSION | 7 | アップロードの中断 |
$_FILESで送信されたデータの中身を確認した時は「0」が入っていたのでアップロードに成功したことになります
PHPでアップロードされたファイルを保存する
それではアップロードされたファイルを実際に保存するスクリプトを解説します。
今回の仕様は「画像ファイルのみ保存可能」「アップロードされたファイルをサーバーに保存」の内容で記述します。
sizeやerror、typeでバリデーションをかけ問題なければアップロード作業を行います。
ファイルをアップロード(実際にはtmp_nameから指定のディレクトリにコピー)します。
ファイルを保存するために「move_uploaded_file()」関数を利用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ // ファイルが選択されているかのチェック if( !$_FILES['file01']['size'] ){ echo 'ファイルが選択されていません。'; exit(); } else{ // エラーがないかチェック if( !$_FILES['file01']['error'] ){ echo 'アップロードエラーが発生しました。'; } // MIMEをチェック if( $_FILES['file01']['type'] != 'image/jpeg' && $_FILES['file01']['type'] != 'image/gif' && $_FILES['file01']['type'] != 'image/png' ){ echo '画像ファイルのみアップロード可能です。'; exit(); } // 一時保存ファイルを指定のディレクトリに保存 $ret = move_uploaded_file( $_FILES['file01']['tmp_name'], 'upload/'.$_FILES['file01']['name'] ); if( $ret ) echo 'アップロードに成功しました。'; else echo 'エラーが発生しました。'; } } ?><!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>$_FILESの利用</title> </head> <body> <form action="./" method="post" enctype="multipart/form-data"> <input type="file" name="file01"> <input type="submit" value="送信"> </form> </body> </html> |
move_uploaded_file関数とは
move_uploaded_file関数は、第一引数に「一時保存のパス」を指定、第二引数に「保存したいディレクトリ名/ファイル名」を指定します。成功すればtrue、失敗すれはfalseが返ってきます。
画像ファイルアップロードの発展系
今回はアップロードされたファイルを元のファイル名で、そのままサーバーに保存しました。
実際のシステム開発ではアップロードする場での間に下記のような処理を行うこともあります。
- 指定の大きさにリサイズ(大容量の画像などをアップされた場合の対処)
- サムネイル用や表示用複数の画像に分けて保存
- ファイル名を任意の文字列に変更(全角文字などを半角英数字のみに変更する)
- クオリティーの調整
$_FILESを利用してみて
$_POSTや$_GETに比べやや複雑で難しい$_FILESですが、送信後の処理は一度開発してしまえば後々流用可能なので、ソースコードをみて処理内容がわかれば問題ないと思います。
S.E->お勧め記事;
- CrowdWorks 提案後、受注に繋がりました。提案〜契約までの流れを解説
- プログラマー になる為に必要な プログラミング以外 の知識・スキル
- XSERVERにSSHを利用してLaravel環境を構築する
- CrowdWorks いつの間にか「プロクラウドワーカー」になっていた
- Shopify APIを利用して在庫管理を行う
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- Panic Nova 購入から1年が過ぎライセンスの更新時期の注意点
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –