Я хочу получить размер удаленного файла. И это можно сделать с помощью этого кода:
$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); ?>