fuelphp+nicEditで画像ファイルのアップロードも自サーバーにする

CMSを作るときに、fuelphpとnicEditという組み合わせがMITライセンスでお気に入りなんですが、 nicEditの画像アップロードが外部サーバーのため、ちょっとプライベートな用途には使いにくいというのがあります。 そこで、どうせMITライセンスなんだし、改造しちゃえ!ってことできちんと自分のサーバーに画像をアップロードするようにしてみました。

nicEdit側の修正

  1. 画像のファイル位置を修正

    1
    iconsPath : '/assets/img/nicEditorIcons.gif',
  2. var nicUploadButton=…の行を展開する

  3. nicURI: のところをファイルをアップロードするURLに変更
  4. アップロード時に表示される画像を削除
1
this.myStatus.setContent('<img src="http://files.nicedit.com/ajax-loader.gif" style="float: right; margin-right: 40px;" /><strong>Uploading...</strong><br />Please wait');

1
this.myStatus.setContent('<strong>Uploading...</strong><br />Please wait');

に変更

  1. 外部サイトを使わないので、外部サイトの表記を削除
1
if(this.uri==this.nicURI){ A.write('<div style="position: absolute; margin-left: 160px;"><img src="http://imageshack.us/img/imageshack.png" width="30" style="float: left;" /><div style="float: left; margin-left: 5px; font-size: 10px;">Hosted by<br /><a href="http://www.imageshack.us/" target="_blank">ImageShack</a></div></div>') }

を削除

Fuelphp側の修正

  1. 公開可能なところに画像呼び出し用URL設置
1
<?php class Controller_File extends Controller_Base { public function action_show($filename = "") { $path = realpath(APPPATH . '../upload/') .DIRECTORY_SEPARATOR. $filename; $pathInfo = ¥Fuel¥Core¥File::file_info($path); header('Content-Type: '.$pathInfo['mimetype']); readfile($path); } }
  1. 公開不可なところに画像アップロード用URL設置
1
<?php class Controller_Admin_File extends Controller_Admin { public function action_img() { $data = array(); if (Input::method() == 'POST') { $config = array('ext_whitelist' => array('gif', 'png', 'jpg', 'jpeg', 'bmp')); Fuel¥Core¥Upload::process($config); if (count(Fuel¥Core¥Upload::get_files()) == 1 && Fuel¥Core¥Upload::is_valid()) { Fuel¥Core¥Upload::save(0); $file = Fuel¥Core¥Upload::get_files(0); $data['url'] = ¥Fuel¥Core¥Uri::create('file/show/') . $file['saved_as']; $path = $file['saved_to'] . $file['saved_as']; list($width, $height, $type, $attr) = getimagesize($path); $data['width'] = $width; $data['height'] = $height; ¥Fuel¥Core¥Session::set('uploadFile', $data['url']); ¥Fuel¥Core¥Session::set('uploadFileWidht', $data['width']); ¥Fuel¥Core¥Session::set('uploadFileHeight', $data['height']); return Fuel¥Core¥Response::forge('<strong>アップロード完了</strong>'); } else { $data['error'] = $this->getFileErrorMessages('エラー'); } } else { $fileName = ¥Fuel¥Core¥Session::get('uploadFile', ''); if ($fileName) { $data['url'] = $fileName; $data['width'] = ¥Fuel¥Core¥Session::get('uploadFileWidht', '100'); $data['height'] = ¥Fuel¥Core¥Session::get('uploadFileHeight', '100'); } else { $data['error'] = "エラー"; $data['sess'] = ¥Fuel¥Core¥Session::get(); } } return Fuel¥Core¥Response::forge('nicUploadButton.statusCb(' . json_encode($data) . ');'); } private function getFileErrorMessages($default = "") { $errorMessage = ""; foreach (Fuel¥Core¥Upload::get_errors() as $file) { foreach ($file['errors'] as $error) { $errorMessage .= "{$error['message']}"; } } if ($error == '') { $errorMessage = $default; } return $errorMessage; } }

ポイントはセッションを使って画像URLを保存するところです。 どうやらアップロードとは別に画像のURLを取得しようとしているらしく、これがないとどの画像を取得したいのかわからなくなり永遠にjsが動き続けました。。。 あと、画像のサイズをきちんと返してあげないとうまく動かないようでした。