如何确保文件存在于服务器上并在 URL 上找出其大小,而无需先下载文件
$url = 'http://site.zz/file.jpg';
file_exists($url); //always is false
filesize($url); //not working
Run Code Online (Sandbox Code Playgroud)
请帮助任何一个有效的例子
该函数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)
无需任何库和文件打开
$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)
| 归档时间: |
|
| 查看次数: |
12880 次 |
| 最近记录: |