月別アーカイブ: 2010年8月

CakePHP MediaPluginを使った携帯からの画像アップロード

概要

詳しいコードは、省略しています。
MediaPluginを使って携帯からの画像をアップロードしたときのことをメモしておく。
携帯からの画像アップロード方法は次の2通り。

  • 画像をメールに添付する
  • PCと同じ方法(inputタグのfile属性を使う)

2番目の方法は、対応しているものとしていないものがある。
まだ対応しているものは少ないと思われる。

環境(使用するもの)

  • CakePHPのShell
  • MySQL
  • MediaPlugin
  • メールサーバ
  • QdmailReciever

完成イメージ

完成イメージ

処理概要

  1. メールにファイルを添付し、登録用のアドレスに送信
  2. 受け取ったメールをCakeのShellで処理
  3. 登録用のアドレスを記載したメールを返信
  4. htmlから画像を登録
  5. fileをMediaPluginで処理

準備

  • MySQLに仮登録用の適当なテーブルを作成し、画像のデータを登録するフィールドを作成(BLOB型)する。
  • メールを送信してもらうアドレスを作成する。(nologin)
  • 作成したアドレスに画像を添付したメールを送信してもらう。

仮登録:サーバ側の処理

  • 受信したメールをShellに渡す。
  • QdmailRecieverを使って、メールの内容を取り出す。
  • 必要なデータをDBに仮登録する。
  • 登録用のURLの作成し、メールを返信。

登録

  • ユーザにURLにアクセスしてもらう。
  • このときにDBに保存していたデータから、画像を作成
  • 登録のボタンを押下してもらう。
  • 一時ファイルの削除などの後処理

気をつけるべきことは次の2つ!!

  1. ファイル保存用のテーブルのfileフィールドにファイルのパスを記載する。
  2. ファイルを作成するのは、ユーザが指定したURLにアクセスしたとき。

2の理由は、Shellで処理するときにファイルを作成すると、ファイルの所有者がnobodyになってしまい、サーバー側で後でファイルの削除が出来なくなるためです。

photo_regist_controller.php

<?php
// ・・・
$this->data['Attachment']['file'] = "ファイルへのパス"
// e.g. "/tmp/hoge.jpg"
?>

CSS3 PIE

あまりCSS3が使えないIE。。

クライアント側がIEのときでもCSS3の機能を使えるようにするために、サーバー側にPIE.htcを設置。

設置したはいいものの、ちゃんと動いてくれなかったのでググったときのメモ。

ちゃんと表示されない場合は各要素に
position:relative
を記述する必要がある。

そうしないとborderやら背景やらが消されてしまう。

参考:
CSS3 PIE
CSSスタイルシート.jp

CakePHP jQuery disableOnSubmitを使うときの注意

disableOnSubmitを使うときの注意点

二重送信を防止するために、jQueryのプラグインdisableOnSubmitを使うと便利だけれど、使うとname属性を取得できなくなる

以下のようにsubmitのボタンで処理を振り分けたいときには、振り分けができなくなるので注意が必要。

<?=$this->Html->script('disableOnSubmit')?>
<script>
	$(function(){
		$('form').disableOnSubmit();
	});
</script>
......
$this->Form->submit('削除', array('name' => 'delete'));
......
$this->Form->submit('修正', array('name' => 'edit'));
......

二重送信防止は修正のときだけでいいよって場合は、次のようにする。
ただしこのときも、修正のsubmitのname属性は取得できない。

<?=$this->Html->script('disableOnSubmit')?>
<script>
	$(function(){
		$('form').disableOnSubmit('.submit');
	});
</script>
......
$this->Form->submit('削除', array('name' => 'delete', 'div' => false));
......
$this->Form->submit('修正', array('name' => 'edit'));
......

ってことで、処理を振り分けたい場合は別の方法を考えないといけない。