Posts tagged file
CakePHP ファイルアップロードするコンポーネント
2CakePHP でファイルアップロードを簡単に行うコンポーネントです。
ReverseFolds – CakePHP File Uploads
データベースにファイル名、MIMEタイプ、サイズなどを記録し、ファイルは指定したディレクトリへアップロードするようになっています。
ビューにファイルアップロード用のタグを設置
<input type='file' name='userfile[]'/>
複数配置したいときは
<input type='file' name='userfile[]'/> <input type='file' name='userfile[]'/>
コントローラに使用するコンポーネントを追加
var $components = array('FileHandler');
アップロード処理
$this->FileHandler->setDebugLevel(1); $this->FileHandler->setRequired(0); $this->FileHandler->setHandlerType('db'); $this->FileHandler->setDbModel('FileUpload'); $uploadDir = 'path/to'; // アップロードするディレクトリを指定 if ($this->FileHandler->upload('userfile', $uploadDir)) { echo 'アップロード成功'; } else { echo 'アップロード失敗'; }
実際の処理などはリンク先からダウンロードしたファイルにコンポーネントの他に、ビュー、コントローラ、モデル、SQL と必要なものは入っているのでソースを見てみるとすぐに分かると思います。
アップロードされるファイルは $uploadDir で指定したディレクトリ内にユニークなディレクトリ名を作成してそのディレクトリ内に元のファイル名で保存してくれます。
その他のメソッド
アップロードできるファイルタイプを限定するメソッド
void setAllowedMime( array $mimeTypes )
ファイルの最大容量を設定するメソッド
void setMaxSize( int $size )
などもあります。
SQL BLOB の容量を計算する方法
1OpenPNE のカスタマイズをしていて会員毎に画像容量の制限をする必要がでてきました。
quota を使用できれば簡単なのですが、OpenPNE は DB に バイナリデータとして画像を保存しているため使用できません。
そこで SQL で容量を計算する方法を考えました。
LENGTH 関数を使用して
SELECT LENGTH(blobカラム)
とすればバイト数を計算できます。
OpenPNE の場合は c_image というテーブルに画像データが格納されています。
そこで特定の会員の日記に使用した画像の容量を計算するのに下記のようにしてみました。
SELECT SUM(LENGTH(i.bin)) FROM c_image as i LEFT JOIN c_diary d ON(d.image_filename_1=i.filename OR d.image_filename_2=i.filename OR d.image_filename_3=i.filename) WHERE d.c_member_id=会員ID
得られる値は byte 数になります。
OpenPNE ユーザID からユーザ情報を取得するグローバル関数
1OpenPNE をカスタマイズしていてユーザID からユーザのニックネームなど簡単に取得できないかと調べてみると、色々なグローバル関数がありました。
openpne/webapp/lib/db/member.php 内で各種定義されています。
ユーザ情報のよく使う部分のみを取得する
- 関数名
- db_member_c_member4c_member_id_LIGHT($c_member_id)
- 引数
- int $c_member_id ユーザID
- 戻り値
- array ユーザ情報
引数はユーザ IDで、ユーザ情報が連想配列で戻されます。
array( 'c_member_id' => 'ユーザID', 'nickname' => 'ニックネーム', 'image_filename' => '画像ファイル名' )
ニックネームはそのままテンプレートで表示できます。
画像ファイル名は以前のエントリの「OpenPNE 画像の保存、表示方法」や「OpenPNE 画像を色々なサイズで表示する」を参考に表示させることができます。
ユーザ情報を取得する
bool $is_secure `c_member_secure`の項目を取得するかどうか
bool $with_profile `c_member_profile`の項目を取得するかどうか
string $public_flag プロフィール項目を取得する場合の公開設定(public, friend, private)
その他
まだまだ色々な関数があります。興味ある方はソースを調べてみるとよいかと思います。
OpenPNE 画像を色々なサイズで表示する
1以前書いたエントリ「OpenPNE 画像の保存、表示方法 」で、OpenPNE にアップロードした画像の表示方法を紹介しました。
表示方法は下記のとおりです。
<img src=&qt;({t_img_url filename=$pet.image1 w=180 h=180})&qt;>
しかし、この方法では 240×240 のような画像が表示できませんでした。
ソースを追ってみると設定ファイルで許可するサイズを設定するところがありました。
openpne/config.php
$GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array('76x76', '120x120', '180x180');
この配列に ’240×240′ を追加すれば 縦か横の長い方が 240px の写真が表示できます。
また、
$GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array();
のように空の配列にすれば制限がなくなり、自由に大きさを指定できます。
ただ、制限はかけておいた方がいいでしょう。
OpenPNE 画像の保存、表示方法
2OpenPNE で写真のアップロード機能を作成していて調べたことをまとめておきます。
画像を保存するテーブル c_image
OpenPNE では画像をDB に保存しています。保存するテーブル名は c_image です。
このテーブルにはプロフィール写真や日記の写真、スキンの画像などが保存されるようです。
CREATE TABLE c_image ( c_image_id int(11) NOT NULL auto_increment, filename text NOT NULL, bin longblob NOT NULL, r_datetime datetime NOT NULL default '0000-00-00 00:00:00', `type` text, PRIMARY KEY (c_image_id), KEY filename (filename(100)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- filename
- 画像のファイル名、任意につけていいみたいですが、プロフィール写真だと
m_2_1188204858.jpg
という感じです。
最初の 「m 」はたぶんプロフィール写真を表す文字、
次の「2」はプロフィール写真のNo(2番目にアップした写真)
次の10桁の数字は多分 time() 関数で取得したアップロードした時間 - bin
- base64_encode した画像ファイルのバイナリデータ
- type
- 画像のタイプ( jpg | gif | png )
- r_datetime
- 登録日時
表示方法
c_image テーブルに格納した画像を表示するHTML
<img src="/img.php?filename=m_2_1188204858.jpg&w=180&h=180&m=pc">
Smarty のタグで書くと
<img src="({t_img_url filename=$pet.image1 w=180 h=180})">
filename に c_image.filename を指定して、
w, h に幅と高さの最大値を指定する。
幅と高さは最大値を超えると自動的にリサイズする。
その他
c_image に画像を保存しておくと管理画面からアップロードされた写真をすべて管理することができるので、SNS を運営する上で便利だと思います。
XREA に設置した WordPress で画像のアップロードができない
18前の投稿で初めて画像をアップロードしました。
そのときに、なかなか画像のアップロードができなかったので対策メモ。
最初はパーミッションでエラーになった
-> FTP から wp-content ディレクリにパーミッションの設定をした。
再度アップロードすると今度は wp-content 内に uploads ディレクトリがないとエラー。
-> FTP からディレクトリの作成をおこない、パーミッションの設定をして再度アップロードしてみた。
今度はファイルを移動できないとのこと。
ググってみると、XREA の PHP はセーフモードでした。
そのためFTP でディレクトリを作成するとユーザが apache になるために保存できなかったのですね。
そこで下記のようにしました。
- ローカル側で wp-content 内に uploads ディレクトリを作成
- そのディレクトリをアップロード
- FTP で wp-content/uploads ディレクトリに書き込みパーミッションを設定
再度アップロードすると今度はうまく行きました。
他には CGI として PHP を動かす方法もあるようです。
参考サイト
WordPress Japan :: トピックを表示 – XREAでファイルアップロードが出来ない
XREA で WordPress ファイルアップロード機能を利用する – Numb.
PHPをCGIとして動かす方法について – XREA&CORE SUPPORT BOARD
PEAR::Pager ページ番号を PATH_INFO で渡す
3ページング処理を行ってくれる PEAR::Pager 、かなり便利です。
通常は
index.php?pageID=2
のようにしてページ番号を渡すのですがこれをPATH_INFO で渡すには下記のようにオプションパラメータを指定します。
$params = array( ... 'path' => 'http://localhost/foo/', 'fileName' => '%d', 'append' => false, cuurentPage => 現在のページ );
ポイント
append = false なら fileName の %d にpageID を埋め込む。
currentPage を指定しないと Pager が現在のページが分からない。
fileName
'path' => 'http://localhost/', 'fileName' => 'foo/%d'
なども可能。append=false なら fileName の %d にpageID を埋め込むということ。
現在のページを取得するには
$path_info = explode("/", $_SERVER['PATH_INFO']); if (isset($path_info[1]) { $currentPage = $path_info[1]; } else { $currentPage = 1; }
PATH_INFO が使用できるか
サーバによっては PATH_INFO が使用できない。
使用できるかは $_SERVER["PATH_INFO"] が存在するかどうか。
ただし、http://localhost/index.php では $_SERVER["PATH_INFO"] には値はセットされないので、 http://localhost/index.php/1 などのようにして $_SERVER["PATH_INFO"] が設定されているか調べる。
Firefox テキストエリアを外部エディタで編集する
1今まではブラウザで textarea を入力するときに秀丸などを立ち上げて、秀丸で文章を作成してそれをコピペしたりしていた。
Firefox の拡張機能「mozex」を使用すると、外部のエディタでテキストエリアを編集することができるということで導入してみた。
インストール
http://www.cas.cmc.osaka-u.ac.jp/~paoon/OriginalDoc/
上記よりインストール
設定
ツール->アドオン から mozex 選択
General タグ
Directory for temporary files にテンポラリディレクトリを指定
例)C:\WINDOWS\Temp
[Browse]ボタンで選択するのが簡単。
Textarea タグ
Edit textbox in UTF-8 にチェック
Text Editor
例)"C:\Program Files\Hidemaru\Hidemaru.exe" /fu8 %t
使用する外部のテキストエディタを[Browse]ボタンで選択
スペースが入っているディレクトリはエラーになるので “” で囲む。
[Browse]ボタンだと勝手にやってくれる。
/fu8 が UTF-8 で秀丸を開く起動オプション
%t は テキストエディタが使用するテンポラリファイル
HotKey を選択して Ctrl+E とキー入力すると Ctrl+E で起動できる。お好みで。
Firefox を再起動
念のため
気になった点
設定項目が勝手に書き換わっていたことがあったのでうまく動作しない場合は確認してみるとよいかも
使い方
textare で右クリック mozex->Edit Textarea で設定したエディタが起動
または、HotKey を設定しておけば設定したキーで起動する。ただし textarea が複数ある場合は選択画面が表示される。
エディタで編集して保存を押し、textareaをクリックすると保存した内容で更新される。
または、エディタは終了すると textarea が更新される。
CakePHP ヘルパーの出力を echo を使わずに出力する方法
2※この投稿の方法はバージョン1.1 までしか使用できないようです。1.2 のソースを確認したところ、$html->input の$return パラメータはなくなっていました。/app/config/core.php に AUTO_OUTPUT という定数もなくなっていました。ご注意ください。
Cakephp のヘルパーを使用していて
<?php echo $html->input('Model/filed', array()); ?>
と書くところを
<?php $html->input('Model/field', array()); ?>
と echo を使用せずに出力するには
/app/config/core.php
AUTO_OUTPUT = true;
にすれば、自動的に出力するようになります。
私はつい echo を書き忘れてしまうので助かります。
ヘルパーのメソッドの $return パラメータを true にするとこの AUTO_OUTPUT を無効にすることもできます。
ただ、各メソッドによって、$return パラメータの位置がバラバラなので、書くときにはヘルパーのソースを確認する必要があるかと思います。
ちなにみに input の場合は
<?php $html->input('Model/field', array(), true); ?>
とすると自動出力を抑止できますので、上記は何も表示されなくなります。
CakePHP 日本語マニュアル
10章 ヘルパー
CakePHP アソシエーションのまとめ(3)
1今回は belongsTo です。
CakePHP アソシエーションのまとめ(1) で hasOne をやりましたが、belongsTo はその逆です。
まとめ(1) で使用したテーブルで説明すると、Profile モデルにUser モデルを関連付けるのが belongsTo になります。
profile.php
<?php class Profile extends AppModel { var $name = 'Profile'; var $belongsTo = array('User' => array('className' => 'User', 'conditions' => '', 'order' => '', 'foreignKey' => 'user_id' ) ); } ?>
配列のそれぞれの意味は CakePHP アソシエーションのまとめ(2) に説明があります。
これで、
$this->profile->findById($id);
とかすると、Profile モデルの該当するID のデータ内容とそのProfile モデルの元の User モデルのデータが取得できます。
もちろん、CakePHP の命名規則に従っていれば、
profile.php
<?php class Profile extends AppModel { var $name = 'Profile'; var $belongsTo = array('User'); } ?>
でもいけます。