如何检查如果一个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请求的响应是一个文件,页面会一直加载,直到服务器上下载了响应中接收到的整个文件并存储在该变量中。

这个函数用$headerz作为头值在$url上发出curl请求,$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是头值。

现在我上传了一个测试文件

a.txt

与内容

ABCDABCDABCD

然后在Web浏览器上成功发出请求并使用ti打印响应后,输出如下

HTTP/1.1 200 OK日期:Fri, 08 july 201107:25:43 GMT服务器:Apache/2.2.16(Debian) X-Powered-By:PHP/5.3.3-7+squeeze1过期:周一,261997年7月05:00:002011年7月8日星期五07:25:43GMTcache - control: no - cache,必须重新验证Pragma: no-cache附加:文件名= " a.txt "Connection: close接受范围:bytesContent-Length: 1应用程序/force-downloadABCDABCDABCD

其中ABCDABCDABCD为TXT文件的内容。如果它是一个音频文件,它会在完全下载后输出一些随机字符。

我需要提示用户下载这些数据,而不是首先将其保存在服务器上或在变量中。

是否有一种方法,我可以检查响应头,如果返回的是一个文件,如果一个文件,然后提示用户下载。

有这个旋度方法的解吗?

  <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表单post。

问候,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 ..........
    }
相关文章: