Получить размер удаленного файла

Я хочу получить размер удаленного файла. И это можно сделать с помощью этого кода:

$headers = get_headers("http://addressoffile", 1); $filesize= $headers["Content-Length"]; 

Но я не знаю адрес файла напрямую. Но у меня есть адрес, который перенаправляется на исходный файл.

Например: у меня есть адрес http://somedomain.com/files/34 Когда я помещаю этот адрес в URL-адрес браузера или использую функцию file_get_contents('myfile.pdf',"http://somedomain.com/files/34"); , он начинает загрузку исходного файла.

И если я использую выше функции для вычисления размера файла, то, используя адрес http://somedomain.com/files/34 он возвращает размер 0.

Есть ли способ получить адрес, где перенаправляется http://somedomain.com/files/34 .

Или любое другое решение для расчета размера перенаправленного файла (исходного файла).

Если сайт перенаправляется через. заголовок местоположения, который вы можете использовать:

 // get the redirect url $headers = get_headers("http://somedomain.com/files/34", 1); $redirectUrl = $headers['Location']; // get the filesize $headers = get_headers($redirectUrl, 1); $filesize = $headers["Content-Length"]; 

Обратите внимание, что этот код не должен использоваться в производстве, так как нет проверок существующих ключей массивов или обработки ошибок.

Если вы хотите получить размер удаленного файла, вам нужно подумать о другом. В этом посте я покажу вам, как мы можем получить размер удаленного файла из его информации заголовка без загрузки файла. Я покажу вам два примера. Один, используя функцию get_headers, а другой – cURL. Использование get_headers – очень простой подход и работает для каждого тела. Использование cURL является более продвинутым и мощным. Вы можете использовать любой из них. Но я рекомендую использовать подход cURL. Вот так..

get_headers Подход:

 /** * Get Remote File Size * * @param sting $url as remote file URL * @return int as file size in byte */ function remote_file_size($url){ # Get all header information $data = get_headers($url, true); # Look up validity if (isset($data['Content-Length'])) # Return file size return (int) $data['Content-Length']; } 

Применение

 echo remote_file_size('http://img.ruphp.com/php/logo4w.png'); 

Подход cURL

 /** * Remote File Size Using cURL * @param srting $url * @return int || void */ function remotefileSize($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_exec($ch); $filesize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); if ($filesize) return $filesize; } 

Применение

 echo remotefileSize('http://img.ruphp.com/php/logo4w.png'); 

Подход cURL хорош, потому что на некоторых серверах get_headers отключается. Но если ваш url имеет http , https и …, вам нужно это:

 <?php function remotefileSize($url) { //return byte $ch = curl_init($url); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_exec($ch); $filesize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); if ($filesize) return $filesize; } $url = "http://img.ruphp.com/php/googlelogo_color_272x92dp.png"; echo remotefileSize($url); ?>