Это можно сделать достаточно надежно, используя библиотеку cURL, и curl_getinfo()
См .: http://www.php.net/manual/en/function.curl-getinfo.php
Единственная проблема заключается в том, что на самом деле запрос будет выполнен, поэтому он займетвремя получения ответа (может быть длинным для больших изображений).
Поэтому выбор между попыткой использовать расширение файла приведет к ненадежному результату, потому что:
- Файл с .png в конце не обязательно является png-изображением
- URL без расширения может довольно легко быть изображением (однако его можно обслуживать)
И имеячтобы получить ответ для проверки mimetype.
Вот пример кода, если вы хотите попробовать его.Это приводит к извлечению логотипа Google на австралийском веб-сайте и повторению mimetype, полученного в заголовке.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com.au/images/logos/ps_logo2.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
if(!curl_errno($ch)) {
$mimetype = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
echo $mimetype;
}
else {
die(curl_error($ch));
}
curl_close($ch);
Вы можете сделать еще один шаг и фактически загрузить файл и сохранить его где-нибудь, чтобы использовать расширение Fileinfo.
file_put_contents('tmp',
file_get_contents('http://www.google.com.au/images/logos/ps_logo2.png')
);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, 'tmp');
finfo_close($finfo);
HTTP-заголовки могут быть отправлены для файлов, которые не относятся к этому типу.Fileinfo должен давать очень надежный результат, потому что он пытается угадать mimetype на основе определенных байтов в реальном файле.