2013-02-05 86 views
1

我正在寫一個PHP程序,用於從後端下載PDF並保存到本地驅動器。現在如何在下載之前檢查文件是否存在?PHP在下載前檢查文件是否存在

目前我正在使用curl(見下面的代碼)來檢查和下載,但它仍然下載大小爲1KB的文件。

$url = "http://wedsite/test.pdf"; 
$path = "C:\\test.pdf;" 
downloadAndSave($url,$path); 

function downloadAndSave($urlS,$pathS) 
    { 
     $fp = fopen($pathS, 'w'); 

     $ch = curl_init($urlS); 

     curl_setopt($ch, CURLOPT_FILE, $fp); 
     $data = curl_exec($ch); 

     $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     echo $httpCode; 
     //If 404 is returned, then file is not found. 
     if(strcmp($httpCode,"404") == 1) 
     { 
      echo $httpCode; 
      echo $urlS; 
     } 

     fclose($fp); 

    } 

我想在下載前檢查文件是否存在。任何想法如何做到這一點?

+0

你看所有PHP的文件系統功能的文檔? http://www.php.net/manual/en/ref.filesystem.php – FoolishSeth

+0

用....檢查文件是否存在[file_exists()](http://www.php.net/manual/en/function .file-exists.php) – 2013-02-05 03:58:02

回答

4

你可以用一個單獨的捲曲HEAD要求做到這一點:

curl_setopt($ch, CURLOPT_NOBODY, true); 
$data = curl_exec($ch); 

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

如果你真的想你可以使用設置NOBODYfalse下載。

+0

添加curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false);以確保上述代碼適用於使用HTTPS的網址 –

2

由於您使用HTTP在互聯網上獲取的資源,你真的要檢查什麼是返回代碼是404

在一些PHP安裝,你可以使用file_exists($url)開箱。但是,這並不適用於所有環境。 http://www.php.net/manual/en/wrappers.http.php

這裏很像file_exists但對於URL的功能,使用curl:

<?php function curl_exists() 
    $file_headers = @get_headers($url); 
    if($file_headers[0] == 'HTTP/1.1 404 Not Found') { 
    $exists = false; 
    } 
    else { 
    $exists = true; 
    } 
} ?> 

來源:http://www.php.net/manual/en/function.file-exists.php#75064

有時捲曲擴展未與PHP安裝。在這種情況下,你仍然可以使用套接字庫在PHP核心:

<?php function url_exists($url) { 
     $a_url = parse_url($url); 
     if (!isset($a_url['port'])) $a_url['port'] = 80; 
     $errno = 0; 
     $errstr = ''; 
     $timeout = 30; 
     if(isset($a_url['host']) && $a_url['host']!=gethostbyname($a_url['host'])){ 
      $fid = fsockopen($a_url['host'], $a_url['port'], $errno, $errstr, $timeout); 
      if (!$fid) return false; 
      $page = isset($a_url['path']) ?$a_url['path']:''; 
      $page .= isset($a_url['query'])?'?'.$a_url['query']:''; 
      fputs($fid, 'HEAD '.$page.' HTTP/1.0'."\r\n".'Host: '.$a_url['host']."\r\n\r\n"); 
      $head = fread($fid, 4096); 
      $head = substr($head,0,strpos($head, 'Connection: close')); 
      fclose($fid); 
      if (preg_match('#^HTTP/.*\s+[200|302]+\s#i', $head)) { 
      $pos = strpos($head, 'Content-Type'); 
      return $pos !== false; 
      } 
     } else { 
      return false; 
     } 
    } ?> 

來源:http://www.php.net/manual/en/function.file-exists.php#73175

更快的功能,可以在這裏找到: http://www.php.net/manual/en/function.file-exists.php#76246

0

在上面$第一個例子file_headers [0]可能包含超過或'HTTP/1.1 404 Not Found'以外的內容,例如:

HTTP/1.1 404 Document+%2Fdb%2Fscotbiz%2Freports%2FR20131212%2Exml+not+found 

所以使用其他測試很重要,例如正則表達式,因爲'=='不可靠。

0

調用此之前,你的下載功能和它的工作:

<?php function remoteFileExists($url) { 
    $curl = curl_init($url); 

    //don't fetch the actual page, you only want to check the connection is ok 
    curl_setopt($curl, CURLOPT_NOBODY, true); 

    //do request 
    $result = curl_exec($curl); 

    $ret = false; 

    //if request did not fail 
    if ($result !== false) { 
     //if request was ok, check response code 
     $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 

     if ($statusCode == 200) { 
      $ret = true; 
     } 
    } 

    curl_close($curl); 

    return $ret; 
} 

>