PHPでアップロード可能なファイルサイズの上限値を取得する

 PHPでアップロードファイルサイズの上限値を設定する方法は見つかるのですが、設定が反映されているかどうかを確認する方法が見つからないので関数を書いてみました。
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 件のコメント:

コメントを投稿

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...