文件上的PHP filesize()>;2 GB

文件上的PHP filesize()>;2 GB,php,filesize,signed,Php,Filesize,Signed,我一直在琢磨如何在PHP中获得大于等于2GB的文件的有效文件大小 示例 在这里,我使用filesize()函数检查一个3827394560字节大的文件的文件大小: echo“文件是”。文件大小('C:\MyFile.rar')。“字节。”; 结果 这就是它的回报: 该文件为-467572736字节 背景 PHP使用有符号整数,这意味着它可以表示的最大数字是2147483647(+/-2 GB)。 这就是它的局限性。我尝试过的解决方案显然是使用COM文件对象的“Size”属性。我不完全确定它使用

我一直在琢磨如何在PHP中获得大于等于2GB的文件的有效文件大小

示例
在这里,我使用filesize()函数检查一个3827394560字节大的文件的文件大小:

echo“文件是”。文件大小('C:\MyFile.rar')。“字节。”;
结果
这就是它的回报:

该文件为-467572736字节

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

这就是它的局限性。

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

这是我的代码:

function real\u filesize($file\u path)
{
$fs=新COM(“Scripting.FileSystemObject”);
返回$fs->GetFile($file\u path)->大小;
}
简称如下:

$file='C:\MyFile.rar';
$size=real\u filesize($file);
echo“文件大小为:$size”;
结果

文件大小为:3827394560字节

提供了在PHP中查找大于2GB文件大小的完整正确方法,无需依赖操作系统特定的接口


其要点是,您首先使用
filesize
获取“低”位,然后打开并查找文件以确定它包含多少倍的2GB(“高”位)。

我使用了一种不同的方法,节省了宝贵的服务器资源, 请查看我的GitHub存储库

这是一个普通的完整的下载仪表板,它克服了
文件大小
错误的(*罕见)情况,使用客户端头请求,它不会嵌入到页面的HTML源代码中,但会在一段时间后呈现(*修复),所以它更适合于嗯,比如说,放松的场景

要使此解决方案可用,应添加一个Apache
.htaccess
(或PHP中的标头),以允许客户端使用
内容长度

基本上,您可以将
.htaccess
精简为只允许
内容长度
删除其他CORS规则。。使网站更安全


没有使用jQuery,整个过程都是在我的三星文本编辑器中编写的,并通过FTP从我的智能手机上传,在我的中乘坐1.5小时的火车,但仍然完美无缺

为了获得正确的文件大小,我经常使用几个月前自己编写的这段代码。我的代码使用:
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"); ?>

我希望这能有所帮助。

我有一个“黑客”解决方案,效果很好

请看我是如何做到这一点的,你还需要包括功能可以很好地工作或改变你的需要

例如:

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);
此函数不是理想的解决方案,但其工作原理如下:

  • 首先检查PHP中是否启用了
    shell\u exec
    。如果启用,它将通过shell命令realfilesize进行检查
  • 如果shell失败且操作系统为64位,则将返回正常的
    filesize()
    信息
  • 如果是32位,将进入“分块”方法并计算文件大小读取值
  • 注意

    Alfter reading将结果保留为字符串格式以便于计算,因为PHP可以计算字符串,但如果将超过2GB的结果转换为整数,则会遇到与以前相同的问题

    警告

    分块是非常慢的,如果你想循环这个,你会有内存泄漏或者脚本可能需要几分钟来完成读取所有文件。如果您在启用了
    shell\u exec
    的服务器上使用此功能,您将拥有超快速读取

    附言


    如果您对这里的更改和改进有什么想法,请随时提交。

    我知道这是一个老版本,但我现在使用的是PHPx64 5.5.38(目前),不想升级到最新的7.x版本

    我确实读过所有关于查找大于2GB的文件大小的帖子,但所有解决方案对于大量文件来说都非常缓慢

    所以,昨天我创建了C/C++PHP扩展名“PHP_filesize.dll”,即使用C/C++的强大功能,通过我发现的一些方法来查找文件大小,它还与UTF-8兼容,速度非常快

    你可以试试:

    用法:

    方法:

    0-使用GetFileAttributesEx

    1-使用CreateFile

    2-使用FindFirstFile

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

    $fsize=php_filesize(“filepath”,可选$method_)

    • 返回最大为9 PB的字符串类型的文件大小
    学分:

    文件大小方法:


    UTF-8支持:

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

    exec("stat --format=\"%s\" \"$file\"");
    
    这假设文件名中没有引号或换行符,从技术上讲,它返回的是字符串而不是我认为的数字,但它与此方法配合使用,可以获得


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

    fyi COM对象表示仅限windows问题在“C:\”中谈论文件,所以他假设环境是windows。@Juanma假设?问这个问题的人在几秒钟后发布了这个答案。但是如果你遇到了这个问题,并且碰巧在这个页面上绊倒了,你最好使用操作系统不可知的解决方案,原因很明显。@MikeB完全正确,像Borelid指出的跨平台解决方案可能更可取,但我个人认为这个方法可能会稍微优化一些。我之所以在几秒钟后发布它,是因为我已经找到了答案,但我想看到更多关于它的意见,并与大家分享我的解决方案