我一直在讨论如何在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)。
这是有限的。
答案 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);
此功能不是理想的解决方案,但以下是有效的方法:
shell_exec
。如果启用,它将通过shell命令real filesize检查。filesize()
信息注意!
读取后保持字符串格式的结果可以很容易地计算,因为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);
积分:
FileSize方法:Check filesize without opening file in c++?
答案 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"); ?>
我希望这会有所帮助。