denisyukphp
@denisyukphp

Можно ли полагаться на HTTP-заголовки при определении размера удалённого файла?

Пилю небольшой проект, в котором нужно реализовать загрузку картинок с локальной машины и по 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? Какие альтернативные решения ещё существуют для картинок и файлов в частности?
  • Вопрос задан
  • 324 просмотра
Решения вопроса 1
@justpusher
Вопрос сводится к такому: всегда ли удалённый сервер шлёт правильный Content-Length? мы не можем быть в этом 100% уверены.

Насколько я понимаю, вы хотите ограничить максимальный размер загружаемых картинок.
Можно поступить так:
1. Запрашиваете хедеры. Если Content-Length есть и больше, сразу отклоняете.
2. Запрашиваете содержимое, контролируя размер получаемых данных. Как только получаете больше данных, чем ваш лимит - обрываете запрос и отклоняете. Вот пример.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы