4

バックエンドから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);

    }

ダウンロードする前に、ファイルが存在するかどうかを確認したい。それを行う方法はありますか?

4

4 に答える 4

9

これは、別のカールHEADリクエストで行うことができます。

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

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

実際にダウンロードしたい場合は、settoを使用できNOBODYますfalse

于 2013-02-05T03:58:33.340 に答える
2

HTTPを使用してインターネット上のリソースをフェッチしているので、本当に確認したいのは、戻りコードが404であることです。

一部のPHPインストールでは、そのまま使用できfile_exists($url)ます。ただし、これはすべての環境で機能するわけではありません。http://www.php.net/manual/en/wrappers.http.php

これはURLによく似た関数ですfile_existsが、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

CURL拡張機能が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

于 2013-02-05T04:01:16.967 に答える
2

ダウンロード機能の前にこれを呼び出してください。

<?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;
}

?>

于 2016-02-28T00:27:04.787 に答える
0

上記の最初の例では、$file_headers[0]に「HTTP/1.1404 NotFound」以上またはそれ以外のものが含まれている可能性があります。例:

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

したがって、「==」は信頼できないため、正規表現などの他のテストを使用することが重要です。

于 2013-12-13T10:56:53.027 に答える