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は下記のようになります。

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‘]

となります。

それでは$_FILESから受け取ったデータの中身確認してみます。
受け取ったデータの中身は下記のようになっています。

<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.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 xlsxxlsx
MIMEタイプ一例
created by Rinker
Webアプリケーションにはなぜ脆弱性が生まれるのか?脆弱性を解消するにはどうプログラミングすればよいか?PHPサンプルへの攻撃を通して脆弱性が生まれる原理と具体的な対処方法が学べる!
created by Rinker
「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?といったことを思考しつつ、「とりあえずは動く」だけで終わらない、現場に求められる品質を形にするための知識とテクニックを解説します。
created by Rinker
Webアプリケーションの定番言語であるPHPの基礎から実践までを、上下巻のフルボリュームで集大成。「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?

[‘tmp_name’]一時保存パスとは?

一時保存パスとは、ファイルをアップロードし指定のディレクトリに保存しますが、その前に仮にデータを保存しています。その保存先のパスが[‘tmp_name’]に格納されています。
任意のディレクトリに保存する際はここから、アップロードしたファイルデータを取得します。

[‘error’]とは?

ファイルをアップロード時に何らかの理由で正常にアップロードできなかった場合、[‘error’]にエラー内容が保存されます。

定数内容
UPLOAD_ERR_OK0成功
UPLOAD_ERR_INI_SIZE1upload_max_filesizeで指定したサイズを超過している
UPLOAD_ERR_FORM_SIZE2name=”max_file_size”で指定したサイズを超過している
UPLOAD_ERR_PARTIAL3ファイルが破損している
UPLOAD_ERR_NO_FILE4指定したファイルが存在しない
UPLOAD_ERR_NO_TMP_DIR5一時保存用のディレクトリが存在しない
UPLOAD_ERR_CANT_WRITE6保存に失敗
UPLOAD_ERR_EXTENSION7アップロードの中断
エラー発生時の主な内容

$_FILESで送信されたデータの中身を確認した時は「0」が入っていたのでアップロードに成功したことになります

PHPでアップロードされたファイルを保存する

それではアップロードされたファイルを実際に保存するスクリプトを解説します。
今回の仕様は「画像ファイルのみ保存可能」「アップロードされたファイルをサーバーに保存」の内容で記述します。

sizeやerror、typeでバリデーションをかけ問題なければアップロード作業を行います。
ファイルをアップロード(実際にはtmp_nameから指定のディレクトリにコピー)します。
ファイルを保存するために「move_uploaded_file()」関数を利用しています。

move_uploaded_file関数とは

move_uploaded_file関数は、第一引数に「一時保存のパス」を指定、第二引数に「保存したいディレクトリ名/ファイル名」を指定します。成功すればtrue、失敗すれはfalseが返ってきます。

画像ファイルアップロードの発展系

今回はアップロードされたファイルを元のファイル名で、そのままサーバーに保存しました。
実際のシステム開発ではアップロードする場での間に下記のような処理を行うこともあります。

  • 指定の大きさにリサイズ(大容量の画像などをアップされた場合の対処)
  • サムネイル用や表示用複数の画像に分けて保存
  • ファイル名を任意の文字列に変更(全角文字などを半角英数字のみに変更する)
  • クオリティーの調整

$_FILESを利用してみて

$_POSTや$_GETに比べやや複雑で難しい$_FILESですが、送信後の処理は一度開発してしまえば後々流用可能なので、ソースコードをみて処理内容がわかれば問題ないと思います。

created by Rinker
PHP7の基本構文から、クラス、DB連携、セキュリティ対策まで、しっかり習得! PHPプログラミングの標準教科書『独習PHP』が、最新のPHP7に対応。PHPでWebページ/アプリケーションを開発する際に必要な基礎的な知識、PHPの基本構文から、クラス、データベース連携、セキュリティまで、詳細かつ丁寧に解説します。
created by Rinker
時間がなくたって、プログラミングは学べます。学習を躊躇していた人たちに、既存の入門書で挫折した人たちに、「これならできる!」の最短カリキュラムを、土日の14時間で提供。まったくのプログラミング初心者が簡単なWebデータベースアプリを構築できるまでの成長コースを、手取り足取り、導きます。

コメントする

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)