簡體   English   中英

如何通過PHP檢查圖像是否存在?

[英]How To Check An Image Exists Or Not Through PHP?

我想在代碼運行時檢查另一個站點/服務器上托管的映像是否存在。 為此,我使用的JavaScript可以很好地滿足我在下面共享的需求。 但是某些瀏覽器不支持JavaScript,或者某些用戶正在使用阻止擴展來阻止JavaScript,因此當時我的代碼確實可以運行。

<script type='text/javascript'>
 var url = 'http://www.example.com/example.jpg';
 var img = new Image();
 img.src = url;
 img.onload = function()
 {
 alert('Image Is Available')
 }
 img.onerror = function()
 {
 alert('Image Is Not Available')
 }
</script>

因此,現在我想通過純PHP來執行與上述代碼相同的操作。 我不想使用fsockopenfile_get_contentscurlget_headers選項來命中並檢查服務器。 我只想打圖像並像上面一樣檢查。 為此,我使用了以下代碼,但無法正常工作。 即使我能夠直接在瀏覽器中打開圖像,其顯示的Image Is Not Available 我在互聯網上找到了此代碼。

<?php
$url = 'http://www.example.com/example.jpg';
if (@GetImageSize($url)) {
echo  "Image Is Available";
} else {
echo  "Image Is Not Available";
}
?>

那么這段代碼有什么錯誤呢? 你能提到並解決... ???

更新 :當我在目標上favicon.ico或其他小尺寸圖像時,請不要提及圖像加載時間或尺寸。

重要問題 :我在另一個目標上檢查了上述PHP代碼,並且其運行正常。 但是我要檢查圖像的地方不起作用。 排雷目標不包含域,其IP地址類似hhtp://XX.XX.XX.XX:XXXX/example.jpg 因此,代碼是正確的,但我的目標是不回復任何外部命中代碼。 當我直接在瀏覽器中打開鏈接時,它會顯示圖像。 所以我這個問題也包含答案。 我會問另一個關於我的新問題的問題。

您粘貼的以下代碼將為您工作:

<?php
$url = 'http://www.example.com/example.jpg';
if (@GetImageSize($url)) {
echo  "Image Is Available";
} else {
echo  "Image Is Not Available";
}
?>

更新:確保到服務器上的端口80(或用於輸出http請求以獲取映像的任何端口)的傳出請求未被阻止。

注意:感謝Pascal Ockert指出GetImageSize不需要GD。 這就是我一直以來的想法,而快速的Google也顯示了很多其他信息。 這是“通過知識來學習更多”的經典示例。

答案最簡單的方法是使用file_exists()函數,其中param是絕對文件路徑,它返回true / false:

$isFileExists = file_exists($filePath);
<?php
$file = 'http://www.example.com/example.jpg';
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}
echo $exists;
?>

嘗試上面的代碼。

更新:

再次考慮,我錯了。 使用GD之類的庫是最簡單,最可靠的方法。 我認為您可能只是使用了錯誤的功能(或未使用GD?)。 函數getimagesize返回描述資源的元素數組 前兩個索引是寬度和高度。 該文檔說,如果沒有圖像或多個圖像或其他文件,則寬度和高度將為0。因此,您可以檢查以下內容:

$img = getimagesize($url);
if($img[0] === 0)
   $imgFound = false;

或者,您可以檢查第三個索引(#2),即文件類型。 要對此進行檢查,請將其與GD 常量進行比較:

if($img[2] === IMG_JPG || $img[2] === IMG_JPEG)
    $imgFound = true;

只需確保已安裝(檢查phpInfo() )。 編輯:然而, 文檔說,不需要使用GD擴展名才能使用getimagesize ,但只有在安裝常量后,這些常量才可用。

原始答案

正如我在評論中說的那樣,如果您無法控制托管該圖像的服務器,則沒有完美的方法,因為它可以響應您的請求,但是它喜歡(拒絕,重定向等)。 但是您可以使用file_get_contents來獲取文件(失敗時返回false ),然后使用$http_response_header檢查標頭以查看其是否為圖像。 這是一個示例腳本:

<?php
$url = 'http://www.example.com/example.jpg';
// some servers will do a redirect to a valid image page, 
// so you don't want to reject a 302 necessarily.
$okCodes = array("200", "302");
$imgFound = false;
$pic = file_get_contents($url);
if($pic !== false) { 
    if(isset($http_response_header[0])) {
        $firstHeader = explode(" ", $http_response_header[0]);
        if(isset($firstHeader[1]) and in_array($firstHeader[1], $okCodes)) { 
            $count = count($http_response_header);
            for($j = 0; $j < $count; ++$j) {
                if(strpos($http_response_header[$j], "Content-Type: image/jpeg") !== false 
                    || strpos($http_response_header[$j], "Content-Type: image/jpg") !== false) {
                    $imgFound = true;
                }
            }
        }
    }

}

// and if you're using ajax, echo it back to your app
if($imgFound) {
    echo json_encode(array("imgFound" => true));
} else {
    echo json_encode(array("imgFound" => false));
}
?>

改善此腳本的一種方法是在$http_response_header找到LAST的“ HTTP / 1.1 [ERROR_CODE] [ERROR_MESSAGE]”標頭(其中可能包含多組標頭-全部合並到一個數組中),這將使您看到實際提供給您的文件的標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM