PHP获取文件大小

今天码PHP的时候碰到一个很蛋疼的问题,我在做文件床路由模块的时候测试用php输出文件下载,但是很大的文件永远下载不完整,浏览器只会下几百M然后就结束了。

于是我开始从文件输出部分开始一步步往回推,到最后发现原来是服务器告诉浏览器这个文件只有这么大,于是浏览器接收了这么多字节后就关闭连接了。

接着我就开始filesize各种大小的文件,发现大于4G的文件都会出现这样的情况,于是我就去php.net逛了一下,只见这血淋淋的一幕

NoteBecause PHP’s integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.

注意:因为PHP的整数类型是有符号整数并且很多平台还他喵的在用32位整数,一些文件系统相关的函数作用在大于2GB文件时可能返回感天动地的结果。

我只想说————————————坑爹呢这是!你都那么多代了这个函数还不升级一下简直有病吧!

虽然它说2GB以上会有问题,不过我测试2GB多文件的时候不知为什么没问题,不过4GB以上的文件就变几百M了。

再于是我就接着在刚刚的页面往下翻,看到了各种各样解决大文件的贡献代码,有一个是这么写的

function getSize($file) { 
        $size = filesize($file); 
        if ($size < 0) 
            if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) 
                $size = trim(`stat -c%s $file`); 
            else{ 
                $fsobj = new COM("Scripting.FileSystemObject"); 
                $f = $fsobj->GetFile($file); 
                $size = $file->Size; //这里是不是写错了啊
            } 
        return $size; 
}

我测试了一下好像没起作用,而且调用一个外部模块好像开销有点大,于是我把这个函数改了一下

function filesizeX($path){//超级文件大小获取函数,解决4G以上文件读取错误文件大小
		if(!((strtoupper(substr(PHP_OS,0,3))=="WIN"))){//如果不是windows系统,尝试使用stat命令
			$size=trim(`stat -c%s $path`);
		}else{//如果是windows系统,尝试cmd命令
			$filename=basename($path);
			$cmd="dir ".dirname($path);//尼玛windows竟然没有查看文件属性的命令,只能列出所有文件再用正则提出来了
			if(preg_match("/([^\s]+)\s".$filename."\n/", `$cmd`,$match)){
				return str_replace(",", "", $match[1]);
			}else{
				return false;
			}

		}
	return (int)$size;//为什么这时候的int就是正常的,官方你怎么说
}

这样就可以正确获取文件大小了,只不过这么做在windows下如果目录里文件很多的话好像也有点废资源,不过大多数服务器还是跑在linux上吧눈_눈,凑活一下能用就好了。。。



本文发布于 https://luojia.me

本站文章未经文下加注授权不得拷贝发布。

0 0 投票数
打分
订阅评论
提醒
guest
6 评论
内联反馈
查看所有评论
龙龙
游客
龙龙
8 年 前

请问博主的代码如何使用?找遍整个百度了就找到你在豆瓣发的帖子再进来了

佳佳菌
游客
8 年 前
回复给  龙龙

填文件路径进去返回文件大小

佳佳菌
游客
8 年 前
回复给  龙龙

另外我似乎没在豆瓣上发过东西诶。。。

trackback
10 年 前

不一样的滋味一样的心情(申博娱乐城管理网) vip.sunbetshenbo.com

不一样的滋味一样的心情(菲律宾太阳城娱乐网) sunbetshenbo.net

False_Flippy
游客
10 年 前

哈哈,下面那个文字