cakephp2.x 画像アップロードMediaPlugin を使う

2013年4月10日更新 view: 102 view

http://www.matomater.com/701/
が良いということで試してみたが、微妙だった・・・。

なぜ微妙?

  • サムネイルの生成機能が弱い
  • 日本語文字列が完全文字化け
  • どうせなら多機能なMediaPluginのが良い

ということで cakephp2.x MediaPlugin の登場!

cakephp 2.x シリーズに対応した mediaplugin が Gitにあるじゃないですか!

https://github.com/bmcclure/CakePHP-Media-Plugin

早速ダウンロード。

条件

  • User 1人に対して複数ファイルのアップロード
  • 適当なユーザーテーブルも作ってある (id , name だけでもOK)

下準備

/app/Plugin/Media/ に上記ファイルを解凍。

/app/Plugin/Media/Config/Schema/media.sql
通りにDBにテーブルを作る

/app/Config/bootstrap.php
にコンフィグファイルを読み込ませる

CakePlugin::load('Media', array('bootstrap'=>true));
require_once(ROOT.'/Plugin/Img/Config/bootstrap.php');//今回はImgプラグインを作って、その中にコンフィグファイルをコピー。

img/config.php を修正

<?php
$mini = array('fitCrop' => array(70, 70),'compress' => 0);
$xs = array('fitCrop' => array(60, 80),'compress' => 0);
$s = array('fit' => array(81, 108),'compress' => 0);
$l = array('fit' => array(399, 532),'compress' => 0);


$original = array('clone' => 'copy');

Configure::write('Media.filter', array(
    'audio'    => compact('s', 'm'),
    'document' => compact('s', 'm', 'original'),
    'generic' => array('original' => array('clone' => 'copy')),
    'image'    => compact('mini','xs','s', 'l','original'),
    'video'    => compact('s', 'm')
));

バグフィクス

https://github.com/bmcclure/CakePHP-Media-Plugin/issues/26
[APP/Plugin/Media/Model/Behavior/GeneratorBehavior.php, line 162]

というエラーが出るので
/Plugin/Media/Model/Behavior/GeneratorBehavior.php 162行目あたり

$filter = Configure::read('Media.filter.default.'.Mime_Type::guessName($file));

に修正。

日本語対応

というより、ファイル名をランダムアルファベットに変更し、日本語を文字化けさせないように。

スポンサードリンク

/Media/Model/Behavior/TransferBehavior.php 290行目あたり
・transferTo メソッド内

$kaku = substr($resource['name'], strrpos($resource['name'], '.') + 1);
$resource['name'] = uniqid().'.'.$kaku;

ファイルの作成

/View/Users/upload.ctp

<?php echo $this->Form->create('User', array('type' => 'file')); ?>
<?php echo $this->Form->input('User.id', array('type' => 'hidden' , 'value' => 777)); ?>
<?=$this->Form->input('Attachment.0.file',array('type' => 'file'));?>
<?=$this->Form->input('Attachment.0.model',array('type' => 'hidden' , 'value' => 'User'));?>
<?php echo $this->Form->submit('Send');?>
<?php echo $this->Form->end(); ?>

/Controller/UsersController.php upload アクション

function upload()
{
    if($this->request->data){
        if($this->User->saveAll($this->request->data)){
            echo 'ok';
        }
    }
}

/Model/User.php

class User extends AppModel {
    var $hasMany = array(
        'Attachment' => array(
            'className' => 'Media.Attachment',
            'foreignKey' => 'foreign_key',
            'conditions' => array('model' => 'User'),
            'dependent' => true,
        )
    );
}

ここまででファイルのアップロードができるようになりました。
/webroot/media/ にファイルが入ります。
また cakephp2 から画像は transfer ではなく、/filter/orijinal/ に格納されます。

色々な設定方法

/Plugin/Img/Config/bootstrap.php

$xmini = array('fitCrop' => array(38, 38),'compress' => 0);//fitCrop や fitOutsideで切り抜き方法を変更
$m = array('fitOutside' => array(399, 532),'compress' => 50);//compress で 画質悪く = ファイル圧縮
$l = array('convert' => 'image/jpeg', 'fit' => array(600, 440));//自動でjpegに変換

Configure::write('Media.filter', array('default' => array(
    'audio' => compact('s', 'm'),
    'document' => compact('s', 'm','original'),
    'generic' => array('original'=>array('clone'=>'copy')),
    'image' => compact('xmini','s', 'm', 'l','original'),//上記で新しく設定した画像サイズを忘れずに追加
    'video' => compact('s', 'm')
)));

できあがり画像のサンプル

リモートファイル、サーバー側のファイルの画像をリサイズ

validateを解除.

tmpフォルダにファイルが無いとエラーになるので、permissionエラーと表示される。
Mediapluginの Attachment.php を Img/Model/Attachment.php にコピー。

パーミッションエラーを修正。

//            'location' => array('rule' => array('checkLocation', array(
//                MEDIA_TRANSFER, MEDIA_UPLOAD_TMP_DIR
//            ))),
//            'permission' => array('rule' => array('checkPermission', '*')),

Attachmentを読み出す場合は img . Attachment と指定して読みだす。

var $hasMany = array(
        'Attachment' => array(
            'className' => 'Img.Attachment',
            'foreignKey' => 'foreign_key',
            'conditions' => array('model' => 'Img'),
            'dependent' => true
        )
    );

これでcomposerからインストールし、updateした場合も上書きされなくて済むようになります。

ファイル選択

直接そのファイルを指定すればOK

$data = array(
    'User' => array(
        'id' => 123
    ),
     'Attachment' => array(
        0 => array(
            'file' => WWW_ROOT.'img/hoge.jpg',
            'model' => 'User',
            'alternative' => 'User'
        )
    ),
);

$this->User->set($data);
if($this->User->saveAll($data)){
}

mediapluginが最強ですね。

スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

12月13日 ( 木 ) にアクセスが多かった記事はこちら!