CakePHP UploadPackプラグインのディレクトリ分散 ITかあさん

ITかあさん

CakePHP UploadPackプラグインのディレクトリ分散

CakePHP UploadPackプラグインのディレクトリ分散がしたい!

UploadPackでアップロードしたファイルをイイ感じに分散したい!
そこそこ反響がありました、

最後にちらっと

一度画像を登録してから最後に自分のオリジナルのディレクトリにファイルを移動させるようなことを処理として行っています。(今回はUploadPackの解説なので、それはまた次の機会に。)

と言ってしばらく放置していたら、UploadPackでアップロードしたファイルのフォルダ分散についてやはり質問を頂きましたので解説します。

ただ、やっていることは非常にシンプルで、

ファイルのアップロード自体はUploadPackで行い、最後に自分の指定した保存先に移動する

ただそれだけなんですよ。

CakePHP UploadPackの唯一の問題点

ITかあさんがCakePHPでCMSを開発する際には、もう無くてはならないプラグインになっているUploadPackなんですが、唯一問題なのは

デフォルトの仕様ではアップロードファイルが一か所に溜まりすぎる

と、いうことなんです。

CakePHP UploadPackのpathのおさらい

UploadPackでアップロードしたファイルの保存先はModelに指定しますね。

	var $actsAs = array(
			'UploadPack.Upload' => array(
				'img' => array(
				'path' => ':webroot/img/:id/:style.:extension',
				'styles' => array(
				'big' => '200x200',
				'small' => '120x120',
				'thumb' => '80x80',
				)
			)
		)
	);

UploadPackのフォルダ

すると、ファイルの保存は1アップロードにつき、1フォルダ。スタイルごとのファイルも同じフォルダに保存されます。

これ、マスター管理者しかアップロードしないケースならそれほど気にならないですが、ユーザーが自由にどんどんアップロードするプログラムなら、3000回アップロードされたら3000フォルダも作られてしまいます。

長く運用するなら、デフォルトのままではちょっと無理があると思います。1つのディレクトリにたくさんファイルやフォルダがあるのはちょっとした重さの原因になったり、管理上もよろしくないです。

たくさんファイルをアップロードするプログラムのフォルダ分散の基本

登録したidを指定した桁数までゼロ埋めして、さらに2桁、3桁くらいでフォルダ分散させます。今回は8桁でやってみます。

$cont_id = sprintf("%08d", $id);
$dir1 = substr($cont_id, 0, 2); //0埋めしたIDをスライスして、一定のファイルごとにディレクトリ分散
$dir2 = substr($cont_id, 2, 3); //一応これで、99999999以上は余裕でいけます。
$file = '/home/example.com/public_html/app/webroot/img/banner/'.$dir1.'/'.$dir2.'/'.$cont_id;

フォルダをちゃんと分散させたほうがいいんだな、ということを頭に入れて、CakePHP UploadPackプラグインで実際にファイルをイイ感じに分散したいと思います。

初夏のJavaScript祭 in サーキュレーションビル ForPro

ページ: 1 2