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


file uploads returning wrong file size on files over 4g

大家好,我有一个文件上传系统,用于上传一些大文件当我上传一个超过4gig的文件时它会返回一个-2323223的文件大小有没有办法解决这个问题目前这只是一个基本的形式我假设这是一个PHP配置或限制文件小于4gig它会正确返回大小

<form method="POST" action="upload.php" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
echo $_FILES["file"]["size"];

32位整数只能寻址这么多。你需要更多的位来寻址超过4GB点的字节,一个大于32位的数字,逻辑上它将是64位。

为了使它工作,你需要在64位CPU和64位操作系统上运行64位PHP,然后你将能够寻址高达1.024 pb的文件。

整数的大小与平台有关,尽管通常值的最大值约为20亿(即32位带符号)。64位平台的最大值通常在9E18左右,除了Windows,它总是32位的。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE来确定,最大值可以使用常量PHP_INT_MAX来确定,从PHP 4.4.0和PHP 5.0.5开始。

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

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

<?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