在下载正文之前处理CURL标题

时间:2009-12-04 21:24:27

标签: php curl

使用PHP和CURL(除非在这种情况下有更好的替代方案,然后是CURL),是否可以让php函数在下载文件之前处理标题响应?

例如:

我有一个脚本可以下载和处理用户提供的网址。我想添加一个检查,以便如果文件对我的进程无效(不是文本文件,太大等),则在服务器浪费时间下载文件之前,CURL请求将被取消。

更新:解决方案 PEAR类HTTP_Request2:http://pear.php.net/package/HTTP_Request2/ 使您能够将观察者设置为连接,并随时抛出异常以取消。完全符合我的需求!

3 个答案:

答案 0 :(得分:6)

使用cURL,执行HTTP HEAD请求以检查标头,然后如果它有效(状态为200),请执行完整的HTTP GET请求。

您必须设置的基本选项是CURLOPT_NOBODY,它会将请求更改为HEAD类型

curl_setopt($ch, CURLOPT_NOBODY, true);

然后在执行查询后,您需要检查可以使用curl_getinfo()

完成的返回状态
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

答案 1 :(得分:5)

我知道这是一个古老的话题,以防万一将来有人来这里。

使用CURL,您可以使用CURLOPT_WRITEFUNCTION,让您放置一个回调,一旦身体响应开始并且需要写入就会被调用。在那一刻,您可以阅读标题并取消该过程,并且不会下载正文。一站式请求。

有关更深入的了解和代码示例,请参阅PHP/Curl: inspecting response headers before downloading body

答案 2 :(得分:1)

这是一个如何解决它的例子:

// Include the Auth string in the headers
// Together with the API version being used
$headers = array(
    "Authorization: GoogleLogin auth=" . $auth,
    "GData-Version: 3.0",
);

// Make the request
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);
curl_close($curl);

// Parse the response
$response = simplexml_load_string($response);

// Output data
foreach($response->entry as $file)
{
       //now you can do what ever if file type is a txt
        //if($file->title =="txt")
        // do something
        else
        // do soething
    echo "File: " . $file->title . "<br />";
    echo "Type: " . $file->content["type"] . "<br />";
    echo "Author: " . $file->author->name . "<br /><br />";
}