2010-10-14 78 views
2

使用预构建的系统获取远程图像并将其保存到服务器。在php中获取远程图像的图像类型

当前没有检查图像是否确实存在于该远程位置,并且它是某种文件类型(jpg,jpeg,gif),我负责执行这两种操作。

我认为这是很微不足道的,因为我会简单地用一个简单的regex和和getimagesize($图像):

$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

所以,当谈到这一点,无论是正则表达式,并和getimagesize()会失败,是有这样做的更好的办法?

回答

12

你可以做

$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 
) 

这会告诉你的资源是否存在,什么内容类型(这不一定也图像类型)它是。

编辑根据Pekka的评论,你仍然可能想要确定它是下载后的MIME类型。见

某些给定的方法也适用于远程文件,因此您可以完全跳过get_headers预检。自己决定哪一个适合你的需求。

+0

+1这很容易。 – Sarfraz 2010-10-14 09:52:49

+1

+1这对第一次检查来说已经足够了。 'getimagesize()'(实际上是解析文件的头部字节)可以在下载后进行第二次检查 – 2010-10-14 09:53:27

+1

这真是太好了,谢谢。意味着我现在可以摆脱正则表达式,并检查200 OK以确保图像存在之后再继续。 – ncremins 2010-10-14 11:28:27

0

将远程文件存储在服务器上,然后在本地运行getimagesize