如何使用PHP cURL库检索带有http响应头的附件

时间:2016-06-30 17:48:09

标签: php curl

我正在尝试检索使用php cURL库发出的http请求的原始附件。现在我得到了html响应,但没有附件。

有一个非常相似的问题here表示使用cURL选项-j。我在php cURL库中找不到等效的set_opt。

当我在浏览器中发出请求时,标题信息中会引用所需的附件,浏览器知道自动下载它。在我的脚本中,我只需要将附件的原始数据加载到变量中。

如何将附件数据加载到php中的变量中?

远程服务器的标头响应:

Cache-Control:must-revalidate, post-check=0, pre-check=0
Content-Disposition:attachment; filename=exel_file.xls
Content-Length:65
Content-Transfer-Encoding:binary
Content-Type:application/download
Date:Thu, 30 Jun 2016 15:12:05 GMT
Expires:Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified:Thu, 30 Jun 2016 16:33:14 GMT
Pragma:public
Server:Microsoft-IIS/7.5
X-Powered-By:PHP/5.2.17

我的php cURL请求:

$url = "https://subdomain.example.com?parameter=1";
$post = "post1=false&".
        "post2=&".
        "post3=false&".
        "post4=&".
        "post5=&".
        "post6=1243123421";

$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookieFile); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookieFile); 
curl_setopt($ch, CURLOPT_USERAGENT,  $userAgent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER,    1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($ch);

我已经尝试直接在https://subdomain.example.com/exel_file.xls访问exel_file.xls但无济于事。

更新:    当我在Chrome开发人员工具中找到它时,我确实设法直接访问该文件。我将网络响应过滤到“doc”,并发现请求与附件绑定。该文件位于https://example.com/exel_file.xls,而不是https://subdomain.example.com/exel_file.xls

1 个答案:

答案 0 :(得分:1)

将CURLOPT_BINARYTRANSFER设置为TRUE并设置内容类型。

<?php

$url = "http://slackbuilds.org/slackbuilds/13.37/multimedia/umplayer.tar.gz";
$opts = array(
  CURLOPT_URL =>$url,
  CURLINFO_CONTENT_TYPE => "text/xml",
  CURLOPT_BINARYTRANSFER => TRUE,
  CURLOPT_RETURNTRANSFER => TRUE
);

$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$info = curl_getinfo($ch); 
curl_close($ch);

header("Content-Type: application/x-gzip"); 
header("Content-disposition: attachment; filename=zipfile.tar.gz");

echo $data;
?>

这有用吗