文件上传在超过4g的文件上返回错误的文件大小

时间:2015-09-08 21:53:40

标签: php upload

大家好我有一些文件上传系统用于一些大文件,当我上传一个超过4gig的文件时,它返回文件大小为-2323223有没有办法解决这个问题只是一个基本形式现在所以我假设它的某个地方的php配置或限制和4 gig下的文件它正确返回大小

<form method="POST" action="upload.php" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>

echo $_FILES["file"]["size"];

2 个答案:

答案 0 :(得分:1)

32位整数只能解决这个问题。您需要更多位来处理超过4GB点的字节,大于32位的数字,逻辑上它将是64位。

为了使其工作,您需要在64位操作系统的64位CPU上运行 64位PHP ,然后您将能够处理大小为1.024 PB的文件。

  

整数的大小取决于平台,尽管最大值约为20亿是通常的值(32位有符号)。 64位平台的最大值通常约为9E18,除了Windows,它总是32位。 PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX。

http://php.net/manual/en/language.types.integer.php

答案 1 :(得分:-1)

获取上传文件的路径并使用以下函数获取其大小:

<?php
  /**
   * Get the size of file, platform- and architecture-independant.
   * This function supports 32bit and 64bit architectures and works fith large files > 2 GB
   * The return value type depends on platform/architecture: (float) when PHP_INT_SIZE < 8 or (int) otherwise
   * @param   resource $fp
   * @return  mixed (int|float) File size on success or (bool) FALSE on error
   */
  function my_filesize($fp) {
    $return = false;
    if (is_resource($fp)) {
      if (PHP_INT_SIZE < 8) {
        // 32bit
        if (0 === fseek($fp, 0, SEEK_END)) {
          $return = 0.0;
          $step = 0x7FFFFFFF;
          while ($step > 0) {
            if (0 === fseek($fp, - $step, SEEK_CUR)) {
              $return += floatval($step);
            } else {
              $step >>= 1;
            }
          }
        }
      } elseif (0 === fseek($fp, 0, SEEK_END)) {
        // 64bit
        $return = ftell($fp);
      }
    }
    return $return;
  }
?>

SRC:http://php.net/manual/en/function.filesize.php#115792