PHP如何判斷遠程圖片文件是否存在

fopen()方法

最簡單的方法就是用fopen(),看看文件可否打開,能打就文件固然就存在。php

01 <?php
02 $url = 'http://www.nowamagic.net/images/test.jpg';
03  
04 if( @fopen( $url, 'r' ) )
05 {
06     echo 'File Exits';
07 }
08 else
09 {
10     echo 'File Do Not Exits';
11 }
12 ?>

fopen() 函數打開文件或者 URL。若是打開失敗,函數會返回 FALSE。html

語法:fopen(filename,mode,include_path,context)安全

參數 描述
filename 必需。規定要打開的文件或 URL。
mode 必需。規定要求到該文件/流的訪問類型。可能的值見下表。
include_path 可選。若是也須要在 include_path 中檢索文件的話,能夠將該參數設爲 1 或 TRUE。
context 可選。規定文件句柄的環境。Context 是能夠修改流的行爲的一套選項。

mode 參數的可能的值:服務器

mode 說明
"r" 只讀方式打開,將文件指針指向文件頭。
"r+" 讀寫方式打開,將文件指針指向文件頭。
"w" 寫入方式打開,將文件指針指向文件頭並將文件大小截爲零。若是文件不存在則嘗試建立之。
"w+" 讀寫方式打開,將文件指針指向文件頭並將文件大小截爲零。若是文件不存在則嘗試建立之。
"a" 寫入方式打開,將文件指針指向文件末尾。若是文件不存在則嘗試建立之。
"a+" 讀寫方式打開,將文件指針指向文件末尾。若是文件不存在則嘗試建立之。
"x" 創 建並以寫入方式打開,將文件指針指向文件頭。若是文件已存在,則 fopen() 調用失敗並返回 FALSE,並生成一條 E_WARNING 級別的錯誤信息。若是文件不存在則嘗試建立之。這和給底層的 open(2) 系統調用指定 O_EXCL|O_CREAT 標記是等價的。此選項被 PHP 4.3.2 以及之後的版本所支持,僅能用於本地文件。
"x+" 建立並以讀寫方式打開, 將文件指針指向文件頭。若是文件已存在,則 fopen() 調用失敗並返回 FALSE,並生成一條 E_WARNING 級別的錯誤信息。若是文件不存在則嘗試建立之。這和給底層的 open(2) 系統調用指定 O_EXCL|O_CREAT 標記是等價的。此選項被 PHP 4.3.2 以及之後的版本所支持,僅能用於本地文件。

fopen() 將 filename 指定的名字資源綁定到一個流上。若是 filename 是 "scheme://..." 的格式,則被當成一個 URL,PHP 將搜索協議處理器(也被稱爲封裝協議)來處理此模式。若是該協議還沒有註冊封裝協議,PHP 將發出一條消息來幫助檢查腳本中潛在的問題並將 filename 當成一個普通的文件名繼續執行下去。網絡

若是 PHP 認爲 filename 指定的是一個本地文件,將嘗試在該文件上打開一個流。該文件必須是 PHP 能夠訪問的,所以須要確認文件訪問權限容許該訪問。若是激活了安全模式或者 open_basedir 則會應用進一步的限制。curl

若是 PHP 認爲 filename 指定的是一個已註冊的協議,而該協議被註冊爲一個網絡 URL,PHP 將檢查並確認 allow_url_fopen 已被激活。若是關閉了,PHP 將發出一個警告,而 fopen 的調用則失敗。函數

一個fopen的用法url

1 <?php
2 $file = fopen("test.txt","r");
3 $file = fopen("/home/test/test.txt","r");
4 $file = fopen("/home/test/test.gif","wb");
5 $file = fopen("http://www.example.com/","r");
6 $file = fopen("ftp://user:password@example.com/test.txt","w");
7 ?>

可是若是圖片資源所在服務器掛掉了,這個函數會一直等待,因此咱們須要一個備用方案。spa

CURL 方法

CURL是個很好用的類庫,下面看下如何用它來判斷。.net

01 <?php
02 $url2 = 'http://www.nowamagic.net/test.jpg';
03  
04 $ch = curl_init();
05 $timeout = 10;
06 curl_setopt ($ch, CURLOPT_URL, $url2);
07 curl_setopt($ch, CURLOPT_HEADER, 1);
08 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
09 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
10  
11 $contents = curl_exec($ch);
12 //echo $contents;
13 if (preg_match("/404/", $contents)){
14     echo '文件不存在';
15 }
16 ?>

curl_exec()執行完以後若是文件不存在,會返回以下信息:

1 HTTP/1.1 404 Not Found
2 Date: Tue, 14 Feb 2012 05:08:34 GMT
3 Server: Apache
4 Accept-Ranges: bytes
5 Content-Length: 354
6 Content-Type: text/html

用正則看看是否有404,有的話文件就不存在。

相關文章
相關標籤/搜索