Archive for 2月, 2008

CakePHP jQuery を使用した Ajax ファイルアップロード

6

下記ページを参考にさせていただきました。
“jQueryを使ったAjaxファイルアップロード” フォーラム – CakePHP Users in Japan
David Golding Design Blog -

上記ページでは jQuery を使用してテキストファイルをアップロードしてテキストの内容を表示するというものですが、画像をアップロードしてアップロードした画像をフォームの下に Ajax を利用して表示するというのをやってみました。

jQuery 使用準備

jquery.js と jquery.form.js を app/webroot/js/ 以下に配置します。
アップロードするビューで上記 JavaScript ファイルを読み込むため下記コードをビューに追加します。
<?php echo $javascript->link(array('jquery.js','jquery.form.js')); ?>

ビューにアップロードするフォームを作成する

今回は users コントローラの form アクションでフォームを表示します。Ajax の処理を行うのは users コントローラの upload アクションです。
views/users/form.ctp

<h1>upload test</h1>
<?php echo $form->create('User',array('name'=>'uploadForm','id'=>'uploadForm','type'=>'file'));?>
<?php echo $form->input('upload_file',array('label'=>'Upload Text File ','type'=>'file'));?>
<?php echo $form->button('アップロード',array('onClick'=>'$('#uploadForm').ajaxSubmit({target: '#uploadFile',url: '/users/upload'}); return false;'));?>
</form>
<div id="uploadFile"></div>

コントローラの処理

views/users/form.ctp から「アップロード」ボタンを押すと users/upload アクションの $this->data にアップロードファイルの情報が入ってきます。ここでは mime タイプによって JPEG ファイルのみをアップロードできるようにしています。アップロード後に views/users/upload.ctp を出力します。

function upload() {
    if (!$this->data['User']['upload_file']) {
        $this->set('error','アップロードするファイルを選択してください');
	$this->render('upload','ajax');
    } else {
	if ($this->data['User']['upload_file']['type'] != 'image/jpeg') {
	    $this->set('error','アップロードできる画像は JPEG のみです');
	    $this->render('upload','ajax');
	} else {
	    $filename = '/files/'.intval(rand()).'.jpg';
	    rename($this->data['User']['upload_file']['tmp_name'], WWW_ROOT.$filename);
	    $this->set('filename', $filename);
	    $this->render('upload','ajax');
	}
    }
}

Ajax が返すビューを作成する

/users/upload で処理した結果を返すビューを作成します。今回は veiws/users/upload.ctp として作成しました。ここで img タグによりアップロードしたファイルを表示しています。

<?php if (!empty($error)): ?>
<p><?php echo $error;?></p>
<?php else: ?>
<p>Upload successful</p>
<?php echo $html->image($filename); ?>
<?php endif; ?>

以上で jQuery を使用して Ajax で画像のアップロードができます。

1月に読んだ本

1

オススメは「本は10冊同時に読め!」。ここまで言い切れるのはすごいなと思いました。あと「人を動かす」はやはり定期的に読み返したい感じです。

CakePHP 好きには「Fast CakePHP」もオススメです。解説が分かりやすいです。

ドラマ化が決定したという「夢をかなえるゾウ」も面白いです。課題まだ全部やってません。。。

本は10冊同時に読め!―生き方に差がつく「超並列」読書術 本を読まない人はサルである! (知的生きかた文庫 な 36-1)

本は10冊同時に読め!―生き方に差がつく「超並列」読書術 本を読まない人はサルである! (知的生きかた文庫 な 36-1)

ウェブを変える10の破壊的トレンド

ウェブを変える10の破壊的トレンド

人を動かす 新装版

人を動かす 新装版

Fast CakePHP (LLフレームワークBOOKS # 4)

Fast CakePHP (LLフレームワークBOOKS # 4)

夢をかなえるゾウ

夢をかなえるゾウ

Keitai Hacks[ケータイハック] ケータイをビジネスに活かす89の方法

Keitai Hacks[ケータイハック] ケータイをビジネスに活かす89の方法

ケータイ「メモ撮り」発想法 (光文社新書)

ケータイ「メモ撮り」発想法 (光文社新書)

「朝30分」を続けなさい!人生勝利へのスピード倍増!朝勉強のススメ

「朝30分」を続けなさい!人生勝利へのスピード倍増!朝勉強のススメ

リクルートのDNA―起業家精神とは何か (角川oneテーマ21 A 61)

リクルートのDNA―起業家精神とは何か (角川oneテーマ21 A 61)

自転車で痩せた人 (生活人新書)

自転車で痩せた人 (生活人新書)

快読100万語!ペーパーバックへの道 (ちくま学芸文庫)

快読100万語!ペーパーバックへの道 (ちくま学芸文庫)

Go to Top