2010-10-14 47 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