CodeIgniterのファイルアップロードクラス

今日は、CodeIgniterのファイルアップロードクラスを勉強してみたいと思います。コードを入力する前に、データのアップロード先を作成しておきます。

CodeIgniterをインストールした場所のルート(私の場合は、CodeIgniterフォルダの直下、すなわち、applicationフォルダ及びsystemフォルダと同じ階層)に、『uploads』という名前のフォルダを作り、パーミッションを777にセットします。Dreamweaverでの作成方法を書いておきます。

ローカルでルートフォルダに『uploads』名のフォルダを作成し、いったんサーバーにアップしたら、展開アイコンをクリックします。

リモートサーバー側の『uploads』フォルダを右クリックして、権限の設定をクリックします。

『ファイルアクセスのプロパティ』ダイアログで、『すべて読み取り』『すべて書き込み』『すべて実行』をクリックして、『OK』ボタンをクリックします。もちろん、上の数字を直接『777』に変更しても構いません。

それでは、今日は、『CodeIgniterユーザガイド日本語版』のサイトに沿って勉強します。まずビューファイルを2つ作成します。『application/views』フォルダに『upload_form.php』ファイルと『upload_success.php』という2つのファイルを作成します。

同じく、Dreamweaverでの手順を書いておきます。ファイル→新規で新規ドキュメントのダイアログを開いたら『空白ページ』『PHP』『なし』を選択し、『作成』ボタンをクリックします。新しく作成されたファイルを『ファイル』→『別名で保存』で『application/views』フォルダに『upload_form.php』名で保存します。同じく『upload_success.php』というファイルも『application/views』フォルダ内に作成しておきます。

『upload_form.php』ファイルを開き、デザイン画面の空白部分をクリックし、フォームタブの『ファイルフィールド』アイコンをクリックします。『inputタグのアクセシビリティ属性』ダイアログは何も入力せずに『OK』ボタンをクリックします。

『フォームタグを入力しますか』のメッセージには、『いいえ』をクリックします。同じように、ファイルの送信ボタンも作成しておきます。

コード画面でファイルフィールドの前に以下のコードを挿入します。

<?php echo $error;?>
<?php echo form_open_multipart('upload/do_upload');?>

送信ボタンの後に『</form>』を挿入します。

ここで、肝心なことを忘れていました。ファイルフィールドの名称を『userfile』に変更しておきます。これを変更しておかないとファイルはアップロードされません。文字幅は別に入力しなくても構いません。CodeIgniterではファイルフィールドの名前は、デフォルトでは、『userfile』となっています。

次に送信が成功したときに表示するページ『upload_success.php』ファイルを開き、コード画面で、<body></body>の間に、下記のコードを入力します。

<h3>ファイルのアップロードに成功しました</h3>
 <ul>
 <?php foreach ($upload_data as $item=>$value):?>
 <li><?php echo $item;?>:<?php echo $valu;?></li>
 <?php endforeach;?>
 </ul>
 <p><?php echo anchor('upload','UPload Another File!');?></p>

それでは、肝心のコントローラを作成します。『applicaiton/controllers』フォルダに『upload.php』という名前のファイルを作成し、下記のコードを記述します。

class Upload extends CI_Controller {

	function __construct()
	{
		parent::__construct();
		$this->load->helper(array('form', 'url'));
	}

	function index()
	{
		$this->load->view('upload_form', array('error' => ' ' ));
	}

	function do_upload()
	{
		$config['upload_path'] = './uploads/';
		$config['allowed_types'] = 'gif|jpg|png';
		$config['max_size']	= '100';
		$config['max_width']  = '1024';
		$config['max_height']  = '768';

		$this->load->library('upload', $config);

		if ( ! $this->upload->do_upload())
		{
			$error = array('error' => $this->upload->display_errors());

			$this->load->view('upload_form', $error);
		}
		else
		{
			$data = array('upload_data' => $this->upload->data());

			$this->load->view('upload_success', $data);
		}
	}
}

それでは、実際にブラウザで確認してみましょう。

パソコン内のjpegファイルを送信してみました。

実際に『uploads』フォルダをのぞいてみました。きちんとファイルがアップロードされています。

コードの解説

まずビューファイル『uproad_form.php』から見てみます。

form_open_multipart();

これは、前回『CodeIgniterのフォームヘルパ』で勉強したFormヘルパの中のひとつです。ファイルをアップロードする際に使うマルチパートの指定を属性に追加します。

つまり『form_open_multipart(‘upload/do_upload’)』は、下記のHTMLタグを生成します。

<form action="http://ci.builwing.co.jp/CodeIgniter/upload/do_upload" method="post" accept-charset="utf-8" enctype="multipart/form-data">

マルチパートとは、一通の電子メールに複数の異なる種類のデータを格納する方式。メールにASCII文字以外のデータを格納するための「MIME」規格の拡張仕様。インターネットの技術仕様の標準化にあたっているIETFにより、RFC 2112として規格化されている。添付ファイルとして画像を送ったりするのに使われる。従来、メールはヘッダと本文という2つの部分しか持てなかったが、マルチパート仕様により、「区切り文字」を境に任意の数の部分(パート)に分割することが可能となった。これにより、例えば1つのメールに本文、画像、ワープロ文書、音声をまとめて送受信することができる。一つのパートを複数のマルチパートに分割する「入れ子」構造も可能である(『IT用語辞典e-Words』より)

次は、ビューファイル『upload_success.php』です。

foreach ~ endforeach

これは、PHPの繰り返し構文です。foreach構文は、指定した配列の要素を1つずつ抜き取って処理します。foreachの最後は、『;(セミコロン)』ではなく、『:(コロン)』ですので、気をつけて下さい。

anchor()

これは、URLヘルパのコードのひとつで、サイトのURLに基づいて、標準のHTMLアンカーリンクを作成します。第1引数は、URLに追加したいセグメントを文字列または配列で指定します。第2引数は、リンクに指定したいテキストで、空のままだとURLが指定されます。第3引数は、リンクタグに指定したい属性のリストを文字列または、連想配列で指定します。つまり、『anchor(‘upload’,’Upload Anothe File!’)』は、下記のようなHTMLタグを生成します。

<a href="http://ci.builwing.co.jp/upload">Upload Another File!</a>

次に、コントローラを見てみましょう。

function __construct()

コンストラクタの復習です。コンストラクタとは何だったでしょうか。コントローラが実行される前に必ず呼び出されるメソッドの事ですね。ついでに、コンストラクタには『parent:: __construct()』は、セットだと覚えておきましょう。

$this->load->helper(array(‘form’,’url’));

これは、特に問題はないと思います。formヘルパとurlヘルパを同時に呼び出しています。

$this->load->view()

これは、ビューファイルを呼び出すメソッドですので、特に問題はないと思います。

次は、今回の主役ファイルアップロードクラスです。

$this->load->library(‘upload’,$config);

配列$configの設定項目に基づいたアップロードクラスを呼び出しています。

$this->upload->display_erros()

do_upload()メソッドがFALSEを返したときの全てのエラーを取得します。試しに容量の大きなファイルを送信したときに出たエラーメッセージが下の図です。

$this->upload->data()

アップロードしたファイルについての情報を配列で返すメソッドです。詳細は、『CodeIgniterユーザーガイド日本語版』サイトをどうぞ。

本日は以上です。









		
			



			

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ