6月 05

18.画像アップロード

go @ 5:39 AM

今回画像はデータベースにはそのファイル名を登録します。
つまり、 members テーブルの img1 、 img2 はファイル名です。
ということで別途、画像の実体という意味合いで solid1 、 solid2 という名前を用意します。
( img1 、 img2 を使い回すと面倒なことになるので)
登録する画像はとりあえず、/app/wwwroot/files の中に保存することにします。

まず add.ctp を書き換えます。

		echo $form->input('img1');
		echo $form->input('img2');

こうなっているところを、

		echo $form->input('solid1', array('type'=>'file', 'label' => '画像1'));
		echo $form->input('solid2', array('type'=>'file', 'label' => '画像2'));

こうします。おっと、
formを enctype=”multipart/form-data” にしないといけませんので。

<?php echo $form->create('Member', array('type'=>'file')); ?>

に変えます。これで、出力は

<form id="MemberAddForm" enctype="multipart/form-data" method="post" action="/~bob/cake/index.php/members/add">

となります。

/app/models/member.php を開いて、モデルの validate を追加します。

		'solid1' => array(
			'rule1' => array(
				'rule' => array('imgType', 'solid1'),
				'message'=>'画像1はJPEG形式で登録してください',
			),
		),

これは ’solid2‘ についても同じように追加しておきます。
いわゆるCakePHP本家Docの4.1.5.2 Adding your own Validation Methodsのやり方なので、自分で ‘imgType’ という名前の function を作ります。
array(‘imgType’, ’solid1′), のうしろの ’solid1′ はその function に渡す引数になります。
以下の function imgType を作って member.php の下の方に入れておきます。

	function imgType($data, $name){
		if (!$this->data['Member'][$name]['type'] || ($this->data['Member'][$name]['type'] == 'image/pjpeg') || ($this->data['Member'][$name]['type'] == 'image/jpeg')) {
			return true;
		} else {
			return false;
		}
	}

単に画像の type が jpeg がどうかをチェックしているだけです。
他にファイルサイズのチェックとか、ファイル名のチェックとか、入れたければ入れます。
で、ちょっとブラウザからテストしてみます。
gif画像なんかを登録した時に、ちゃんと「画像1はJPEG形式で登録してください」のエラーが出たでしょうか。
最後にコントローラ members_controller.php に画像を保存する処理を追加します。
確認画面の時に作った validates の下に、

				if ($this->Member->validates($this->data)) {
					if ($this->data['Member']['solid1']['type']){
						$this->data['Member']['img1'] = $this->_imgUpload('solid1');
					}

とします。( img2 も同様に追加する)
ここの _imgUpload は画像を保存するための function で、自分で作ります。
solid1 の画像実体を保存し、その時に画像のファイル名を生成して、そのファイル名を img1 として返します。

	function _imgUpload($name) {

		if ($this->data['Member'][$name]['tmp_name']){

			$fd = fopen($this->data['Member'][$name]['tmp_name'], "r");
			$filesize = $this->data['Member'][$name]['size'];
			$filedata = fread ($fd, $filesize);
			fclose ($fd);

			$img_file = md5($filedata). ".jpg";
			$res = fopen(WWW_ROOT . "files/" . $img_file,'w');
			fwrite($res,$filedata);
			fclose($res);

			return $img_file;
		}
	}

こんな感じです。とりあえず、同じコントローラの下の方に入れておきます。

確認画面 confirm.ctp に表示されるよう修正します。

		<tr>
			<td><?php __('Img1'); ?></td>
			<td>
				<?php echo $member['Member']['img1']; ?>
			&nbsp;
			</td>
		</tr>

こうなってるのを、

	<tr>
		<th><?php __('画像1'); ?></th>
		<td>
			<?php if (isset($member['Member']['img1'])){ echo $html->image("/files/".$member['Member']['img1']);} ?>
			&nbsp;
		</td>
	</tr>

こうします。

“hidden” 部分には

	echo $form->input('solid1.type', array('type'=>'hidden'));
	echo $form->input('solid1.size', array('type'=>'hidden'));

を追加します。
確認画面で画像が表示されたでしょうか。

最後、メールの添付ファイルに指定します。
members_controller.php に戻って、addアクションの、saveしてるところ、

				if ($this->Member->save($this->data)) {

の下に以下を追加します。

					$attachments = array();
					if ($this->data['Member']['img1']){
						$attachments[] = WWW_ROOT . "files/" . $this->data['Member']['img1'];
					}

$attachments 配列に画像のパスを追加してるだけです。
img2 についても同様に追加します。

>>次のページ「編集・退会」へ

Comments are closed.

here comes