PHP获取远程文件大小

jopen 10年前

获取本地文件大小filesize()就可以了,但是如何获取远程文件的大小呢? 这里介绍四个方法来获取远程文件的大小.

方法1:get_headers

<?php   get_headers($url,true);      //返回结果   Array   (       [0] => HTTP/1.1 200 OK       [Date] => Sat, 29 May 2004 12:28:14 GMT       [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)       [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT       [ETag] => "3f80f-1b6-3e1cb03b"       [Accept-Ranges] => bytes       [Content-Length] => 438       [Connection] => close       [Content-Type] => text/html   )   ?> 
此处可以直接根据Content-Length来获取到远程文件的大小了.

方法2: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;   } 
方法3:fsock
function getFileSize($url)   {       $url = parse_url($url);       if($fp = @fsockopen($url['host'],emptyempty($url['port'])?80:$url['port'],$error))       {           fputs($fp,"GET ".(emptyempty($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;       }   }     


方法4:file_get_contents

$fCont = file_get_contents("http://www.cnmiss.cn/");   echo strlen($fCont)/1024; 
以上四种方法