【问题标题】:download and save a gzip file using php curl使用 php curl 下载并保存 gzip 文件
【发布时间】:2012-05-09 18:40:19
【问题描述】:

我正在尝试使用 curl 和 php 下载 gzip 文件并将其保存在指定位置。下面是我正在使用的代码,但每次它都保存一个空文件,尽管它正在下载的 gzip 文件是正确的

$file_zip = 'abc.gz'
$fp = fopen("$file_zip", "w"); 
$request = curl_init();
$headers = array('Content-type: application/x-gzip','Connection: Close');
curl_setopt($request, CURLOPT_URL, $url);
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($request, CURLOPT_TIMEOUT, 0);
curl_setopt($request, CURLOPT_CONNECTTIMEOUT,0);
curl_setopt($request, CURLOPT_HTTPHEADER,$headers);
curl_setopt($request, CURLOPT_FAILONERROR, true);
curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($request, CURLOPT_AUTOREFERER, true);
curl_setopt($request, CURLOPT_BINARYTRANSFER,true);

curl_setopt($request, CURLOPT_FILE, $fp);

$zipFile = curl_exec($request);

【问题讨论】:

  • 你用过copy()吗?使用 cURL 有什么特殊原因吗?
  • 实际上,实际文件是在我的主控制器的某个临时位置生成的(其 url 以 curl url 形式给出),这个特定的 php 脚本将其拾取并最终将其上传到外部ftp 服务器。
  • 好的,如果你不使用任何标题怎么办?喜欢$headers = 0;
  • returntransfer 和 file 有点矛盾。 “将请求的 url 返回到 php 脚本”,还有“不,将其写入文件”。检查 $zipfile 是否包含实际的 zip 数据(例如 echo strlen($zipFile).
  • 我不知道,我没有尝试,但发送“Connection-Close”标头可能会在获得结果之前关闭连接,这可能会导致文件为空。

标签: php curl gzip


【解决方案1】:

我找到了一种使用 cUrl 将文件下载到某个位置的方法。希望对您有所帮助:

<?php 
function get_file1($file, $local_path, $newfilename) 
{ 
    $err_msg = ''; 
    echo "<br>Attempting message download for $file<br>"; 
    $out = fopen($newfilename, 'wb'); 
    if ($out == FALSE){ 
      print "File not opened<br>"; 
      exit; 
    } 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_FILE, $out); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_URL, $file); 

    curl_exec($ch); 
    echo "<br>Error is : ".curl_error ( $ch); 

    curl_close($ch); 
    //fclose($handle); 

}//end function 
?>

来源是:http://www.weberdev.com/get_example.php3?ExampleID=4009

【讨论】:

  • 感谢@tpaksu,但我的 curl 调用和后端文件创建操作有点不同。实际上,对控制器的 curl 调用会生成 3 个单独的报告(以 csv 格式),然后将这些报告作为 tar 球压缩到一个临时文件中,然后作为对我的 curl 调用的响应,使用 passthru() 函数流出.一旦文件流出,临时gzip压缩文件将被删除。
  • 好的,但事情是这样的,后端将创建 gzip 并保存到一个临时位置作为文件,因为 curl 被调用,完成文件创建后,从后端返回一个字符串,curl 将此时结束返回输出的字符串,然后您将检查该字符串并通过 copy() 将文件复制到您的位置。 curl 只会告诉后端创建文件并在创建完成后返回一些字符串。
  • 但是如果我的 gzip 文件是在与我的 curl 脚本运行的服务器不同的服务器上创建的,那么 copy() 是否也适用于远程文件?
  • 文件创建成功后会返回字符串,此时curl会返回。
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2010-11-03
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多