dongmaoluan5719 2012-10-25 12:11 采纳率: 100%
浏览 105
已采纳

PHP获得实际的最大上传大小

When using

ini_get("upload_max_filesize");

it actually gives you the string specified in the php.ini file.

It is not good to use this value as a reference for the maximum upload size because

  • it is possible to use so-called shorthandbytes like 1M and so on which needs alot of additional parsing
  • when upload_max_filesize is for example 0.25M, it actually is ZERO, making the parsing of the value much harder once again
  • also, if the value contains any spaces like it is interpreted as ZERO by php, while it shows the value without spaces when using ini_get

So, is there any way to get the value actually being used by PHP, besides the one reported by ini_get, or what is the best way to determinate it?

  • 写回答

6条回答 默认 最新

  • drghhp8706 2014-08-18 11:50
    关注

    Drupal has this implemented fairly elegantly:

    // Returns a file size limit in bytes based on the PHP upload_max_filesize
    // and post_max_size
    function file_upload_max_size() {
      static $max_size = -1;
    
      if ($max_size < 0) {
        // Start with post_max_size.
        $post_max_size = parse_size(ini_get('post_max_size'));
        if ($post_max_size > 0) {
          $max_size = $post_max_size;
        }
    
        // If upload_max_size is less, then reduce. Except if upload_max_size is
        // zero, which indicates no limit.
        $upload_max = parse_size(ini_get('upload_max_filesize'));
        if ($upload_max > 0 && $upload_max < $max_size) {
          $max_size = $upload_max;
        }
      }
      return $max_size;
    }
    
    function parse_size($size) {
      $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size.
      $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size.
      if ($unit) {
        // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by.
        return round($size * pow(1024, stripos('bkmgtpezy', $unit[0])));
      }
      else {
        return round($size);
      }
    }
    

    The above functions are available anywhere in Drupal, or you can copy it and use it in your own project subject to the terms of the GPL license version 2 or later.

    As for parts 2 and 3 of your question, you will need to parse the php.ini file directly. These are essentially configuration errors, and PHP is resorting to fallback behaviors. It appears you can actually get the location of the loaded php.ini file in PHP, although trying to read from it may not work with basedir or safe-mode enabled:

    $max_size = -1;
    $files = array_merge(array(php_ini_loaded_file()), explode(",
    ", php_ini_scanned_files()));
    foreach (array_filter($files) as $file) {
      $ini = parse_ini_file($file);
      $regex = '/^([0-9]+)([bkmgtpezy])$/i';
      if (!empty($ini['post_max_size']) && preg_match($regex, $ini['post_max_size'], $match)) {
        $post_max_size = round($match[1] * pow(1024, stripos('bkmgtpezy', strtolower($match[2])));
        if ($post_max_size > 0) {
          $max_size = $post_max_size;
        }
      }
      if (!empty($ini['upload_max_filesize']) && preg_match($regex, $ini['upload_max_filesize'], $match)) {
        $upload_max_filesize = round($match[1] * pow(1024, stripos('bkmgtpezy', strtolower($match[2])));
        if ($upload_max_filesize > 0 && ($max_size <= 0 || $max_size > $upload_max_filesize) {
          $max_size = $upload_max_filesize;
        }
      }
    }
    
    echo $max_size;
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 下面三个文件分别是OFDM波形的数据,我的思路公式和我写的成像算法代码,有没有人能帮我改一改,如何解决?
  • ¥15 Ubuntu打开gazebo模型调不出来,如何解决?
  • ¥100 有chang请一位会arm和dsp的朋友解读一个工程
  • ¥50 求代做一个阿里云百炼的小实验
  • ¥20 DNS服务器所在的国家不同与你的IP地址所在国家
  • ¥15 查询优化:A表100000行,B表2000 行,内存页大小只有20页,运行时3页,设计两个表等值连接的最简单的算法
  • ¥15 led数码显示控制(标签-流程图)
  • ¥20 为什么在复位后出现错误帧
  • ¥15 结果有了,想问一下这个具体怎么输入
  • ¥15 怎么修改鸿蒙app的UI及功能设计
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部