簡體   English   中英

如何在將 CURL 請求的響應保存在變量中之前檢查它是文件還是 HTML/文本? (PHP/卷曲)

[英]How to check if a responce of a CURL request is a file or HTML/Text before saving it in a variable? (PHP/CuRL)

我正在請求一個像(Rapidshare)這樣的網站,作為回應,它給了我請求的文件或一些 HTML 告訴我需要等待 xx 秒才能下載文件。 在我很困惑如何編碼這個場景。

現在,如果我使用 HTML 表單進行發布,在其中設置一些字段,然后使用 Javascript 將其自動提交到目標站點。 如果成功,則會提示用戶是否要下載該字段,如果由於某種原因(例如用戶需要等待)而失敗,則會將用戶帶到該站點URL。

避免用戶重定向到目標站點錯誤頁面。 我正在使用 CURL,它發送 POST 請求並讀取響應。 現在,問題是,如果 CURL 請求的響應是一個文件,頁面會一直加載,直到並且除非響應中收到的整個文件下載到服務器上並存儲在該變量中。

這個 function 這使得 curl 在 $url 請求 $headerz 作為 header 值, $encoded 是請求參數

 function makeCurlPostRequest($url, $headerz, $encoded){
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       if($headerz!=null)
       curl_setopt($ch, CURLOPT_HTTPHEADER, $headerz);
       curl_setopt($ch, CURLOPT_HEADER, 1);
       curl_setopt($ch, CURLOPT_POST, 1);
       if($encoded!=null)
       curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
       curl_setopt($ch, CURLOPT_AUTOREFERER, 0);
       curl_setopt($ch, CURLOPT_REFERER, $url);
       $output = curl_exec($ch);
       curl_close($ch);
       return $output;
    }



 function checkUrl($file,$url,$headerz){
        $post_data = array ( "premium_acc" => "checked",
            "linkx" => "$file"
        );
        $encoded = '';
        foreach($post_data as $name => $value) {
          $encoded .= urlencode($name).'='.urlencode($value).'&';
        }
        $scrapHTML = makeCurlPostRequest($url, $headerz, $encoded);
        return $scrapHTML;
    }

CheckUrl,接受 3 個參數,$file 下載文件鏈接,$url url 請求,$headerz 是 header 值。

現在我上傳了一個測試文件

一個.txt

有內容

ABCDABCDABCD

然后在使用 ti 在 Web 瀏覽器上發出成功請求並打印響應后,輸出此

HTTP/1.1 200 OK 日期:2011 年 7 月 8 日星期五 07:25:43 GMT 服務器:Apache/2.2.16 (Debian) X-Powered-By:PHP/5.3.3-7+squeeze1 到期時間:1997 年 7 月 26 日星期一格林威治標准時間 05:00:00 最后修改時間:2011 年 7 月 8 日星期五 07:25:43GMT接受范圍:字節內容長度:1 內容類型:應用程序/強制下載 ABCDABCDABCD

其中 ABCDABCDABCD 是 TXT 文件的內容。 如果它是一個音頻文件,它會在完全下載后輸出一些隨機字符。

我需要提示用戶下載這些數據,而不是先將其保存在服務器或變量中。

有沒有辦法,我可以檢查響應 header 如果返回的是一個文件,如果一個文件則提示用戶下載。

這種 CURL 方法有什么解決方案嗎?

或者

  <form action="d.php" method="POST">
            <input type="hidden" name ="url" value="<?php echo $url;?>"/>
     <?php 
     foreach($scrapHTML->find('input') as $field) {
      $name = $field->name;
      $value = $field->value;
     ?>       
            <input type="hidden" name ="<?php echo $name;?>" value="<?php echo $value;?>"/>
            <?php
     }
            ?>
        </form>
        <script type="text/javascript">
            void(document.forms[0].submit());
    </script>

此 HTML 表單向目標 URL 發送請求,成功后會提示用戶下載文件,但問題是如果出現錯誤,它會將用戶帶到該網站錯誤或等待頁面,我不想對用戶可見。

請提供解決方案,使用 curl 或使用 HTML 表單發布。

問候, aqif

    $opts = array ( 'http' => array ( 'max_redirects' => 1, 'ignore_errors' => 1 ) );
    stream_context_get_default ( $opts );
    $headers = get_headers ( $url, true );
    if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
       ....... DO YOUR CODE ..........
    }

編輯:將此設置為發送 POST 變量

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
   stream_context_get_default ( $opts );
    $headers = get_headers ( $url, true );
    if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
       ....... DO YOUR CODE ..........
    }

暫無
暫無

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

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