读取超过2 GB的PHP文件大小

时间:2018-03-20 02:53:22

标签: php upload filesize

让我先说一下我的说法我已经编写了很长时间,但是我只擅长HTML和Perl - 我对PHP的体验非常有限所以我基本上是一个直接的菜鸟,当涉及到PHP。但是,时代要求我试图让它为我工作,因为Perl不会削减它。

我想要做的是......我有一个脚本试图在服务器上提取文件的文件大小并将其用于各种目的(显示,计算等)。该脚本是blueimp jQuery-File-Upload的UploadHander.php脚本中的上传处理程序。

https://github.com/blueimp/jQuery-File-Upload/

问题在于它尝试读取和处理超过2 GB的文件作为我正在操作的服务器(令我沮丧的是,我无法更改它)是32位。

所以这就是问题......脚本使用filesize()函数拉取文件大小。该文件超过2GB,因此出错。我找到了一个简单的解决方法函数,它成功地从服务器中提取文件大小并完美地显示它,但是当我尝试将它集成到UploadHandler.php脚本中时它不起作用....

这是尝试提取文件大小的函数:

protected function fix_integer_overflow($size) {
    if ($size < 0) {
        $size += 2.0 * (PHP_INT_MAX + 1);
    }
    return $size;
}

protected function get_file_size($file_path, $clear_stat_cache = false) {
    if ($clear_stat_cache) {
        if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
            clearstatcache(true, $file_path);
        } else {
            clearstatcache();
        }
    }
    return $this->fix_integer_overflow(filesize($file_path));
}

以下是某人编写的功能,当单独运行时,成功从服务器中提取完整文件大小:

protected function filesize2($path) {
  $sizeInBytes = @filesize($path);
  if($sizeInBytes===false) {
    $command = "/bin/ls -l ".escapeshellarg($path);
    $ret = trim(exec($command)); 
    if(!substr_count($ret, "ls:") && !substr_count($ret, "Aucun fichier")) {
      $ret = str_replace("\t", " ", $ret);
      $ret = str_replace("  ", " ", $ret);
      $ret = str_replace("  ", " ", $ret);
      $ret = str_replace("  ", " ", $ret);
      $arr = explode(" ", $ret);
      $sizeInBytes = $arr[4];
    }
  }
  return $sizeInBytes;
}

所以我知道原始代码可以正常工作,因为它可以很好地处理较小的文件,我知道拉大文件大小的代码可以正常工作,而且当我把filesize2放入时,UploadHander.php脚本可以工作( )函数代码进入它而不使脚本访问它,但当我替换它:

return $this->fix_integer_overflow(filesize($file_path));

有了这个:

return $this->fix_integer_overflow(filesize2($file_path));

UploadHandler.php脚本完全不再起作用,即使只提供较小的文件......我已经尝试了我能想到的一切,我已经研究了我能在这里和其他论坛上的所有内容网站,我被卡住了。希望有经验的PHP编码人员知道我做错了什么,并能够帮助我正常工作。看起来这应该很简单,但显然不是!谢谢你的阅读。

0 个答案:

没有答案