PHP側で最大ファイルサイズを取得すれば、.htaccessやapacheサーバ設定の兼ね合いで実際の上限値が思った値になっていなかった場合でも、そのことが簡単にわかります。
具体的には、アップロードページで「『アップロードできるファイルのサイズは20MBまでです』などと表示しつつ、実際には2MBのファイルまでしかアップロードできない」といったような、厄介な不具合を回避できます。
この関数を書くにあたって、Apptechs Blog様の.htaccessへのアップロード上限の設定方法から上限値を決める設定オプションを、PHPリファレンスマニュアルのini_get()関数から設定オプションの値を取得する方法とバイトサイズへの変換関数を、それぞれ参考にさせていただきました。
PHPソース
//アップロードファイルサイズの上限を取得するfunction getMaxUploadSize(){
/*アップロードファイルサイズの上限は以下の3項目のうちの最小値。
通常は memory_limit > post_max_size > upload_max_filesize
*/
$limit_max = (ini_get_bytes('post_max_size') < ini_get_bytes('upload_max_filesize') )?
'post_max_size' : 'upload_max_filesize';
$limit_max = (ini_get_bytes($limit_max) < ini_get_bytes('memory_limit'))?
$limit_max : 'memory_limit';
return ini_get($limit_max);
}
//設定オプションを整数表現に変換して返す。
function ini_get_bytes($varname) {
$val = ini_get($varname);
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// 'G' は PHP 5.1.0 以降で使用可能です
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
追記
PHPリファレンスマニュアルのini_get()関数のページに「ini_get()で取得できる設定値は"2M"とかのstringでintじゃないから、しっかり変換噛ませないとだめだよ」と書いてあるのに、うっかりしてini_get()の戻り値をそのまま比較してしまいました。最初はこんな風に書いて値を比較しようとしていたわけです。
$limit_max = ($limit_max < ini_get('memory_limit'))?
$limit_max : ini_get('memory_limit')?
おかげで、「最大サイズ128MB」と表示されて「おかしいなー」と頭をひねることに。
リファレンスマニュアル側でわざわざ例として関数return_bytes()を示してまで強調してくれていたのに、恥ずかしい限りです。
そして、ini_get_bytes()関数はこのreturn_bytes()を改造したものです。
0 件のコメント:
コメントを投稿