如何在php脚本中通过url查找文件大小

Evg*_*niy 4 php

如何确保文件存在于服务器上并在 URL 上找出其大小,而无需先下载文件

$url = 'http://site.zz/file.jpg';
file_exists($url); //always is false
filesize($url); //not working
Run Code Online (Sandbox Code Playgroud)

请帮助任何一个有效的例子

Lat*_*san 7

该函数file_exists()仅适用于本地服务器上存在的文件。

相似地; filesize()函数返回本地服务器上存在的文件的大小。

如果您尝试加载给定 url 的文件大小,您可以尝试以下方法

function get_remote_file_info($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_NOBODY, TRUE);
    $data = curl_exec($ch);
    $fileSize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    $httpResponseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return [
        'fileExists' => (int) $httpResponseCode == 200,
        'fileSize' => (int) $fileSize
    ];
}
Run Code Online (Sandbox Code Playgroud)

用法:

$url = 'http://site.zz/file.jpg';
$result = get_remote_file_info($url);
var_dump($result);
Run Code Online (Sandbox Code Playgroud)

输出示例:

array(2) {
  ["fileExists"]=>
  bool(true)
  ["fileSize"]=>
  int(12345)
}
Run Code Online (Sandbox Code Playgroud)


Evg*_*niy 6

无需任何库和文件打开

$data = get_headers($url, true);
$size = isset($data['Content-Length'])?(int) $data['Content-Length']:0;   
Run Code Online (Sandbox Code Playgroud)

打开远程文件:

function fsize($path) { 
      $fp = fopen($path,"r"); 
      $inf = stream_get_meta_data($fp); 
      fclose($fp); 
      foreach($inf["wrapper_data"] as $v) { 
        if (stristr($v, "content-length")) { 
          $v = explode(":", $v); 
          return trim($v[1]); 
        } 
      } 
      return 0;
    } 
Run Code Online (Sandbox Code Playgroud)

用法:

$file = "https://zzz.org/file.jpg"; 
$inbytes = fsize($filesize);
Run Code Online (Sandbox Code Playgroud)

使用套接字:

function getRemoteFileSize($url){ 
   $parse = parse_url($url); 
   $host = $parse['host']; 
   $fp = @fsockopen ($host, 80, $errno, $errstr, 20); 
   if(!$fp){  
     $ret = 0;  
   }else{ 
     $host = $parse['host']; 
     fputs($fp, "HEAD ".$url." HTTP/1.1\r\n"); 
     fputs($fp, "HOST: ".$host."\r\n");  
     fputs($fp, "Connection: close\r\n\r\n"); 
     $headers = ""; 
     while (!feof($fp)){  
       $headers .= fgets ($fp, 128);  
     } 
     fclose ($fp); 
     $headers = strtolower($headers); 
     $array = preg_split("|[\s,]+|",$headers); 
     $key = array_search('content-length:',$array); 
     $ret = $array[$key+1]; 
   }   
   if($array[1]==200) return $ret; 
   else return -1*$array[1]; 
 } 
Run Code Online (Sandbox Code Playgroud)