しっかり理解する CakePHP Upload プラグインの使い方 (5) アップロードされたファイルをリネームする方法

この記事を読むのに必要な時間は約 7 分です。


CakePHP の Upload プラグインは、通常アップロードされたファイルのファイル名は変わらずに配置されますが、ファイル名を変える方法が分かりましたので、ご紹介したいと思います。

アップロード元のファイル名をそのまま使うとなると、日本語ファイル名などの場合に、ファイルシステムの文字コード等の関係で予期せぬ動作をしかねない不安があります。

試してみたら、意外と簡単でした。

[pn-box color=”lgray”]

CakePHP Upload プラグイン関連記事は、以下よりご覧下さい。

tag : CakePHP

[pn-box-close] [pn-box color=”lgray” size=”smaller”]

【更新履歴】

2016/01/26 更新 : サンプルソースを PHP5.5 でも利用可能なソースに修正しました。また、これまでの記事にカラム名などを合わせました。KERBEROS さんコメントありがとうございます!

[pn-box-close]

 


cake-logo

アップロードされたファイル名を変える方法

ざっくりまとめると、以下を行うことでできます。

  1. Upload Behavior を登録した Model に リネーム後の文字列を返す function を用意する
  2. Upload Behavior のオプションで、“nameCallback” => “用意した関数名”  を指定する

サンプルソース

Attachement テーブルの attachement カラムにファイル名が入る場合を例とします。

app/Model/Attachement.php テーブルの attachment カラムに対して Upload Behavior を適用します。

class Attachment extends AppModel{
...
  public $actsAs = array(
    "Upload.Upload" => array(
      "attachment" => array(
        "nameCallback" => "rename",
      ),
    ),
  );
...
  public function rename($field,$filename,$data,$option){
    return hash("md5", $fileName) . "." . pathinfo( $fileName, PATHINFO_EXTENSION );
  }
...
}

rename という function を用意しました。

ファイル名の md5 ハッシュ値 + 拡張子 を新しいファイル名として返しています。

[pn-box color=”lgray” size=”smaller”]

2016/01/26 更新 : PHP 5.5 以下でも利用可能なよう、可変引数 ( …$param ) を使わないように修正しました。また、”Upload.Upload” の指定が抜けていたのを修正しました… orz。

[pn-box-close]

注意点

関数は Model クラスに用意する

共通関数などを呼び出したい場合は、Model クラスに用意した関数の中で呼び出すようにすれば OK かと思います。

用意する関数は public に

Upload Behavior クラスから呼ばれるので、private や protected ではエラーになります。

nameCallback オプション指定は文字列で

用意した関数名を文字列で指定します。間違える人はあまりいないかも知れません…。

 

callback 時に、受け取るパラメーター

呼ばれる際のパラメータは、以下の通りです。

  • 第一引数 : カラム名 (Behavior を適用したカラム)
  • 第二引数 : アップロードしたファイル名
  • 第三引数 : data
    Model のデータですが、id・dir・type・size などは埋まる前の状態です
  • 第四引数 : Behavior 設定時に指定したオプション

 

プラグインのソースはこうなっている

GitHub のソースを見ると、以下が見つかりました。

/* l.1084 - l.1093 */
if (is_callable(array($model, $callback), true)) {
  $newName = $model->{$callback}($field, $currentName, $data, $options);
}

if (!is_string($newName) || strlen($newName) == 0) {
  CakeLog::write('debug', sprintf(__('No filename after parsing. Function %s returned an invalid filename'), $callback));
} else {
  $name = $newName;
}

 

ひとこと

やってみたら、意外と簡単にできました。

Upload プラグインは、中々に便利ですね。これからもガンガン利用したいと思います。

 

[pn-cakephp-env plugins=”true”]

今回は以上です。


[pn-amzn-cakephp]

3件のコメント

  1. このシリーズものすごく読み込んで今プラグインを設定しています。
    詳細の情報ありがとうございます!

    今までの過去の記事では
    Attachment モデルの
    attachment カラムで説明していましたが。

    この記事では
    Image モデルの
    file_name カラムで説明していましたが。

    で説明なさっているので読者は少し気をつけないとうっかりハマるかもしれませんね。

  2. 下記のバージョンではこのままでは動かなかったので下記のようにしてみました。
    CakePHP(tm) v 0.2.9
    Upload Plugin 2.0

    public function rename($field,$filename,$data,$option){
    $fileName = explode(“.”, $filename);
    //配列の末尾を削除して、返り値で取り出し
    $extention = array_pop($fileName);
    return hash(“md5”, implode( ‘.’ ,$fileName) ) . “.” . $extention ;
    }

    1. KERBEROS さん
      閲覧・コメントありがとうございます。
      おそらく、(…$params)の可変引数が PHP5.5 以前ではエラーになったかと思います。
      PHP5.5 でも動作可能なコメントいただいたソースの方が良いですね。
      記事に反映したいと思います。
      合わせて、ご指摘の通り、シリーズ記事と合わせて Attachment モデルの attachment カラムの例にしたいと思います。
      ご指摘ありがとうございます!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です