Пилю небольшой проект, в котором нужно реализовать загрузку картинок с локальной машины и по URL. Перед закачкой картинок хотелось бы проверять их размер. В случае загрузки из браузера можно полагаться на $_FILES['upload']['size'] или filesize(), а по URL, первое что приходит на ум — чекать HTTP-заголовки. Очевидно, что заголовки можно подменить, но скачивать файл полностью на сервер или в переменную для валидации считаю не комильфо, т.к. долго и затратно.
$ch = curl_init('http://i.imgur.com/VpDM99Ob.jpg');
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
Функция curl_getinfo() возвращает ассоциативный массив с различными значениями, среди которых присутствует "download_content_length" (размер скачанных данных, прочитанный из заголовка "Content-Length").
Array
(
[url] => 'http://i.imgur.com/VpDM99Ob.jpg',
[content_type] => 'image/jpeg',
[http_code] => 200,
[download_content_length] => 6300,
/* ... */
)
Значение "download_content_length" может быть равно -1, если не задан HTTP-заголовок "Content-Length", но в таком случае мы можем инвалидировать, что за искомым URL прячется не изображение, т.к. все сервера, как правило, отдают бинарным файлам "Content-Length" и "Content-Type", если нет каких-либо махинаций.
— Можно ли подобным образом выявить размер загружаемого файла по URL? Какие альтернативные решения ещё существуют для картинок и файлов в частности?