第10章 ファイルを操作してみよう

10.5 ファイルをアップロードしてみよう

プログラムでファイルを操作するには、Webサーバ内にファイルがあることが前提になり、サーバ内にあるファイルしか操作できないことになります。他のファイルを利用したいならその都度FTPツールで、ファイルをサーバへ送信する必要があります。そこで、ファイルをアップロードする仕組み(HTMLとPHP両者)を利用すれば、任意のファイルをサーバへ送信しプログラムで利用することができるようになります。


図 10.5.1:ファイルアップロード

ファイルをサーバへアップロードするには、以下の手順が必要になります。

  1. <form>タグに「enctype=”multipart/form-data”」の属性を追加する。
  2. 送信形式をPOSTにする。※ファイルなどの大容量データを送るにはPOSTでしか行えません。
  3. <form>タグ内に<input>タグの属性type=”file”を配置する。
  4. スーパグローバル変数$_FILESを使ってアップロードデータを操作する。
  5. 組み込み関数を使って、アップロードデータファイルを任意の場所にアップロードする。

凡例:ファイルアップロード(送信元の記述)

上記のようにフォームタグの記述は、必ずmethod属性は「POST」、enctype属性を設定しないといけません。後はinputタグのtype属性を「file」として、name属性に任意の名前を付けます。この部品名がPHP側でデータを取得する際の名前になります。
凡例ではinputタグのtype属性を「file」と「submit」しか利用していませんが、もちろん他のtypeを同時に利用することも可能です。

凡例:ファイルアップロード(送信先の記述)

組み込み関数move_uploaded_fileを利用することで、送信データを正式な場所にアップロードすることができます。第1引数にファイルの実体の場所、第2引数にアップロードするファイルの名前と位置を指定します。

送信データはスーパーグローバル変数$_FILES [‘部品名’][‘tmp_name’]で取得できる場所に一時的に格納されています。上記凡例では、第1引数に「$_FILES[‘myfile’][‘tmp_name’]」を、第2引数はアップロードしたい場所と名前を設定します。今回は$_FILES[‘myfile’][‘name’]を設定しているためアップロードした時の名前で、PHPファイルのある場所にアップロードすることになります。
また、$FILES[‘部品名’]からキーを指定して取得出来る情報は、以下の表を参考にしてください。

表 10.5.1:$_FILESのキーで取得可能な情報

ファイルをアップロードするプログラム

ユーザーが任意で選んだファイルを、サーバ上へアップロードする方法を確認します。

アップロードファイル格納フォルダー準備

ch10直下に「upfile」フォルダーを作成します。


図 10.5.2:アップロードファイル格納用フォルダーの作成

アップロード用ファイル準備


図 10.5.3:アップロード用ファイルの作成

ソース・フォルダー: myproj_basic/ch10
パッケージ: fileUpload.php
アクセスURL:http://localhost/myproj_basic/ch10/fileUpload.php

fileUpload.php

実行結果

アップロードファイルを選択した場合

アップロードファイルを選択しなかった場合

アップロードファイルの確認

ch10/upfileフォルダーを右クリック > リフレッシュを選択します。
※アップロードしたファイルが表示されます。

図 10.5.4: アップロードファイルの確認

解説

6~9行目のフォームでファイル送信できる設定を行います。
フォームタグのenctype属性に「multipart/form-data」、method属性を「POST」、action属性は自分自身に送信するようにしています。そして、フォームタグ内にinputタグのtype属性「file」を設定しています。このinput属性とフォームの属性両方揃ってファイルデータを送信することができるようになります。

今回のプログラムは1つのファイルで機能を作成しているため、14行目で$_FILES[‘upfile’]の送信データ確認を行います。isset関数を使うことでデータ送信されている(送信ボタンからの遷移)のか、されていないのか(初回アクセス)を判断することができます。

16~28行目の処理は送信ボタンが押されて遷移してきた時に行う処理になります。
まず16行目のif文ではファイルが選択されて、送信ボタンが押されたのかを確認しています。ファイルが選択されていればifブロックの処理をそうでない場合はelseブロックの処理になりエラーメッセージを表示します。
18行目ではアップロードする場所と名前を設定しています。今回の場所はch10内の「upfileフォルダー」にオリジナルファイル名でアップロードするようにしています。変数$upNameは「./upfile/uptest.txt」となります。「./」は同じディレクトリ内を意味し、省略した記述と同じ意味を持っています。
21行目でmove_uploaded_file関数を使って、一時的に保存されている送信ファイル(第1引数)を、アップロードしたい場所と名前(第2引数)でアップロードしています。この関数は処理の正否「成功:true、失敗:false」をboolean型の戻り値で返すので、if~else文で判定しその正否に応じたメッセージを画面に表示しています。
成功の場合は指定した場所に、ファイルがアップロードされます。

ファイルアップロードの仕組みを利用して、任意のファイルをサーバへアップロードできることが確認できました。今回のプログラムのようにテキストファイルだけはなく、画像ファイル、圧縮ファイル、csvファイル等もサーバへ送信することができ、ユーザーの送信データを使ってWebアプリケーションを作成することもできます。このファイルアップロードの仕組みは、しっかり覚えておきましょう。

アップロードしたファイル名の文字化け

半角英数字のファイルをサーバへ送信する場合、何の問題もありませんが、日本語のファイルを送信しようとするとファイル名が文字化けしてしまう可能性があります。
原因は扱うファイルデータの文字コードとサーバ自身の文字コードにずれがあるためです。本テキスト環境で日本語のファイルをサーバへ送信したいなら「Shift_JIS」へ変換する必要があります。

上記のように、mb_convert_encoding関数を使って指定のファイル名(第1引数)を,SJIS(第2引数)に変換します。第3引数は元の文字コードを設定しますが、「auto」を指定することで全ての文字コードに対応できるため「auto」を設定しています。
この文字コードの変換設定は環境によって異なりますので、ご自身のお使いの環境に合わせて設定するようにしてください。

NEXT>> 10.6 本章のまとめ