文件上的PHP filesize()>;2 GB
我一直在琢磨如何在PHP中获得大于等于2GB的文件的有效文件大小 示例文件上的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”属性。我不完全确定它使用
在这里,我使用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指出的跨平台解决方案可能更可取,但我个人认为这个方法可能会稍微优化一些。我之所以在几秒钟后发布它,是因为我已经找到了答案,但我想看到更多关于它的意见,并与大家分享我的解决方案