получение типа изображения удаленного изображения в php

Работа над созданной системой, которая захватывает удаленные изображения и сохраняет их на сервере.

В настоящее время нет проверки на изображении относительно того, действительно ли он существует в этом удаленном местоположении, и он имеет определенный тип файла (jpg, jpeg, gif), и мне поручено сделать то и другое.

Я думал, что это было довольно тривиально, поскольку я просто использовал простое регулярное выражение и getimagesize ($ image):

$remoteImageURL = 'http://www.exampledomain.com/images/image.jpg'; if(@getimagesize($remoteImageURL) && preg_match("/.(jpg|gif|jpeg)$/", $remoteImageURL) ) { // insert the image yadda yadda. } 

Проблема возникает, когда у меня нет никакого контроля над URL-адресом, с которого я беру изображение, например:

http://www.exampledomain.com/images/2?num=1

поэтому, когда дело доходит до этого, как regex, так и getimagesize () не сработают, есть ли лучший способ сделать это?

Вы могли бы сделать

 $headers = get_headers( 'http://www.exampledomain.com/images/2?num=1' ); 

В переменной $headers будет содержаться что-то вроде

 Array ( [0] => HTTP/1.1 200 OK [1] => Date: Thu, 14 Oct 2010 09:46:18 GMT [2] => Server: Apache/2.2 [3] => Last-Modified: Sat, 07 Feb 2009 16:31:04 GMT [4] => ETag: "340011c-3614-46256a9e66200" [5] => Accept-Ranges: bytes [6] => Content-Length: 13844 [7] => Vary: User-Agent [8] => Expires: Thu, 15 Apr 2020 20:00:00 GMT [9] => Connection: close [10] => Content-Type: image/png ) 

Это покажет вам, существует ли ресурс и какой тип контента (который не обязательно является также типом изображения).

EDIT в соответствии с комментарием Пекки, вы все равно захотите определить его тип mime после загрузки. Видеть

  • Как проверить, является ли файл MP3 или файлом изображения .

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

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