PHP filesize()On Files> 2 GB

时间:2012-02-19 02:24:00

标签: php filesize signed

我一直在讨论如何在PHP中获取> = 2 GB的文件的有效文件大小。

示例
在这里,我使用filesize()函数检查大小为3,827,394,560字节的文件的文件大小:

echo "The file is " . filesize('C:\MyFile.rar') . " bytes.";

结果
这就是它的回报:

  

该文件为-467572736字节。

背景
PHP使用有符号整数,这意味着它可以表示的最大数字是2,147,483,647(+/- 2 GB)。
这是有限的。

7 个答案:

答案 0 :(得分:4)

http://us.php.net/manual/en/function.filesize.php#102135提供了一种完整而正确的方法,可以在PHP中查找大于2GB的文件大小,而不依赖于特定于操作系统的接口。

它的要点是你首先使用filesize获取“低”位,然后打开+搜索文件以确定它包含多少2GB的倍数(“高”位)。

答案 1 :(得分:3)

我尝试过的解决方案显然是使用COM FileObject的“Size”属性。我不完全确定它使用的是什么类型。

这是我的代码:

function real_filesize($file_path)
{
    $fs = new COM("Scripting.FileSystemObject");
    return $fs->GetFile($file_path)->Size;
}

简称如下:

$file = 'C:\MyFile.rar';
$size = real_filesize($file);
echo "The size of the file is: $size";

<强>结果

  

文件大小为:3,827,394,560字节

答案 2 :(得分:1)

我使用不同的方法,保存宝贵的服务器资源, 看看我的GitHub存储库 github.com/eladkarako/download.eladkarako.com

简单完整,下载 - 信息中心,克服 filesize的(*罕见)案例错误使用客户端头部请求,被授予,它不会嵌入到页面的HTML源代码中,但会在一段时间后呈现(*固定),因此更适合于hmm。 ..,让我们说,放松场景..

要使此解决方案可用,应添加Apache .htaccess(或PHP中的标头),允许客户端使用Content-Length值。

基本上你可以减少.htaccess,只允许Content-Length删除其他CORS规则..让网站更安全。

没有使用jQuery,整个东西都写在我的三星文本编辑器中,并通过FTP从我的智能手机上传,在MILUIM.. 的1.5小时火车车程中然而,仍然无可挑剔;)

答案 3 :(得分:0)

我有一个&#34; hacky&#34;解决方案运作良好。

请查看THIS function我是如何做到的,您还需要包含this class功能才能正常运行或根据您的需要进行更改。

示例:

include_once 'class.os.php';
include_once 'function.filesize.32bit.php';

// Must be real path to file
$file = "/home/username/some-folder/yourfile.zip";
echo get_filesize($file);

此功能不是理想的解决方案,但以下是有效的方法:

  1. 首先检查PHP中是否启用了shell_exec。如果启用,它将通过shell命令real filesize检查。
  2. 如果shell失败并且OS为64位将返回正常的filesize()信息
  3. 如果是32位将进入&#34; chunking&#34;方法和计算文件大小阅读buytes。
  4. 注意!

    读取后保持字符串格式的结果可以很容易地计算,因为PHP可以计算字符串但是如果你将2GB以上的结果转换成整数,你将遇到与之前相同的问题。

    警告!

    Chunking非常慢,如果你想循环它,你将有内存泄漏或脚本可能需要几分钟才能完成所有文件的读取。如果您在启用了shell_exec的服务器上使用此功能,您将获得超快速读取。

    P.S。

    如果你对这里的变化有所了解,那么改进的人可以随意提交。

答案 4 :(得分:0)

我知道这是个老歌,但我现在使用的是PHP x64 5.5.38,现在还不想升级到最新的7.x版本。

我确实阅读了所有有关查找文件大小大于2GB的文章,但是所有解决方案在处理大量文件时都很慢。

因此,昨天,我创建了C / C ++ PHP扩展“ php_filesize.dll”,它使用C / C ++的功能通过一些我发现的方法来查找文件大小,它也与UTF-8兼容并且非常快。

您可以尝试: http://www.jobnik.org/files/PHP/php_filesize.zip

用法:

方法:

0-使用GetFileAttributesEx

1-使用CreateFile

2-使用FindFirstFile

-1-使用stat64(默认和可选)

$ fsize = php_filesize(“ filepath”,$ method_optional);

  • 以字符串类型最多返回9 PetaByte的文件大小

积分:

FileSize方法:Check filesize without opening file in c++?

UTF-8支持:https://github.com/kenjiuno/php-wfio

答案 5 :(得分:0)

对于碰巧在Linux主机上的任何人,我发现最简单的解决方案是使用:

exec("stat --format=\"%s\" \"$file\"");

这假定文件名中没有引号或换行符,并且从技术上讲返回的是字符串而不是我想的数字,但是使用此方法可以很好地获得 human readable file size

我测试过的最大文件约为3.6 GB。

答案 6 :(得分:-1)

为了获得正确的文件大小,我经常使用几个月前我自己编写的这段代码。我的代码使用:exec / com / stat。我知道它的极限,但这是一个很好的起点。最好的办法是在64位架构上使用filesize()

<?php
  ######################################################################
  # Human size for files smaller or bigger than 2 GB on 32 bit Systems #
  # size.php - 1.3 - 21.09.2015 - Alessandro Marinuzzi - www.alecos.it #
  ######################################################################
  function showsize($file) {
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
      if (class_exists("COM")) {
        $fsobj = new COM('Scripting.FileSystemObject');
        $f = $fsobj->GetFile(realpath($file));
        $size = $f->Size;
      } else {
        $size = trim(@exec("for %F in (\"" . $file . "\") do @echo %~zF"));
      }
    } elseif (PHP_OS == 'Darwin') {
      $size = trim(@exec("stat -f %z " . $file));
    } else {
      $size = trim(@exec("stat -c %s " . $file));
    }
    if ((!is_numeric($size)) || ($size < 0)) {
      $size = filesize($file);
    }
    if ($size < 1024) {
      echo $size . ' Byte';
    } elseif ($size < 1048576) {
      echo number_format(round($size / 1024, 2), 2) . ' KB';
    } elseif ($size < 1073741824) {
      echo number_format(round($size / 1048576, 2), 2) . ' MB';
    } elseif ($size < 1099511627776) {
      echo number_format(round($size / 1073741824, 2), 2) . ' GB';
    } elseif ($size < 1125899906842624) {
      echo number_format(round($size / 1099511627776, 2), 2) . ' TB';
    } elseif ($size < 1152921504606846976) {
      echo number_format(round($size / 1125899906842624, 2), 2) . ' PB';
    } elseif ($size < 1180591620717411303424) {
      echo number_format(round($size / 1152921504606846976, 2), 2) . ' EB';
    } elseif ($size < 1208925819614629174706176) {
      echo number_format(round($size / 1180591620717411303424, 2), 2) . ' ZB';
    } else {
      echo number_format(round($size / 1208925819614629174706176, 2), 2) . ' YB';
    }
  }
?>

<?php include("php/size.php"); ?>

<?php showsize("files/VeryBigFile.tar"); ?>

我希望这会有所帮助。