PHP获取本地文件、远程文件的大小
jopen
10年前
php中获取文件大小时要考虑两种情况:本地文件、远程文件,下面总结一下开发过程中使用的处理方法。
一、获取本地文件的大小
直接使用filesize() 函数,可以返回指定文件的大小。
若成功,则返回文件大小的字节数。若失败,则返回 false 并生成一条 E_WARNING 级的错误。
二、获取远程文件的大小
远程文件的大小需要打开远程的文件流,处理的方式有四种:
1,get_headers
get_headers($url,true); 返回结果如图所示:
2,file_get_contents
$file = file_get_content($url); echo strlen($file)/1024;
3,curl方式
function remote_filesize($uri,$user='',$pw='') { // start output buffering ob_start(); // initialize curl with given uri $ch = curl_init($uri); // make sure we get the header curl_setopt($ch, CURLOPT_HEADER, 1); // make it a http HEAD request curl_setopt($ch, CURLOPT_NOBODY, 1); // if auth is needed, do it here if (!emptyempty($user) && !emptyempty($pw)) { $headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $okay = curl_exec($ch); curl_close($ch); // get the output buffer $head = ob_get_contents(); // clean the output buffer and return to previous // buffer settings ob_end_clean(); echo '<br>head-->'.$head.'<----end <br>'; // gets you the numeric value from the Content-Length // field in the http header $regex = '/Content-Length:\s([0-9].+?)\s/'; $count = preg_match($regex, $head, $matches); // if there was a Content-Length field, its value // will now be in $matches[1] if (isset($matches[1])) { $size = $matches[1]; } else { $size = 'unknown'; } //$last=round($size/(1024*1024),3); //return $last.' MB'; return $size; }
4,socket方式
function getFileSize($url) { $url = parse_url($url); if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error)) { fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n"); fputs($fp,"Host:$url[host]\r\n\r\n"); while(!feof($fp)) { $tmp = fgets($fp); if(trim($tmp) == '') { break; } elseif(preg_match('/Content-Length:(.*)/si',$tmp,$arr)) { return trim($arr[1]); } } return null; } else { return null; } }
以上是开发中使用过的四种方式,处理速度个人认为socket的方式较快,get_headers、file_get_contents比较慢。大伙根据实际情况来选择合适的处理方式吧。
来自:http://my.oschina.net/xtfjt1988/blog/368448