使用cURL下载ZIP文件

时间:2016-02-08 12:35:35

标签: php curl zip fopen

我正在尝试使用来自给定网址的cURL下载ZIP文件。 我从供应商那里收到了一个URL,我应该下载一个ZIP文件。但每当我尝试下载ZIP文件时,我都会看到一条说明我没有登录的页面。

我应该从中获取文件的URL如下所示:

https://www.tyre24.com/nl/nl/user/login/userid/USERID/password/PASSWORD/page/L2V4cG9ydC9kb3dubG9hZC90L01nPT0vYy9NVFE9Lw==

在这里,您可以看到USERID和PASSWORD是使用正确数据填充的变量。奇怪的是,如果我在浏览器中输入URL似乎有效,那么zip文件就会被下载。

但是每当我用cURL调用该URL时,我似乎得到了一个不正确的登录页面。有人能告诉我我做错了吗?

似乎在给定网址后面有一个重定向,这就是我在cURL调用中推出的原因:curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

这是我的代码:

set_time_limit(0);

//File to save the contents to
$fp = fopen ('result.zip', 'w+');

$url = "https://www.tyre24.com/nl/nl/user/login/userid/118151/password/5431tyre24/page/L2V4cG9ydC9kb3dubG9hZC90L01nPT0vYy9NVFE9Lw==";

//Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$url));

curl_setopt($ch, CURLOPT_TIMEOUT, 50);

//give curl the file pointer so that it can write to it
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$data = curl_exec($ch);//get curl response

//done
curl_close($ch);

我做错了吗?

2 个答案:

答案 0 :(得分:2)

要通过CURL从外部来源下载 zip 文件,请使用以下方法之一:

第一种方法:

function downloadZipFile($url, $filepath){
     $ch = curl_init($url);
     curl_setopt($ch, CURLOPT_HEADER, 1);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
     $raw_file_data = curl_exec($ch);

     if(curl_errno($ch)){
        echo 'error:' . curl_error($ch);
     }
     curl_close($ch);

     file_put_contents($filepath, $raw_file_data);
     return (filesize($filepath) > 0)? true : false;
 }

downloadZipFile("http://www.colorado.edu/conflict/peace/download/peace_essay.ZIP", "result.zip");

一些评论:

  • 从您必须设置的远程源获取数据 CURLOPT_RETURNTRANSFER选项
  • 而不是随后调用fopen ... fwite函数 使用更方便的file_put_contents

以下是使用上述方法在几分钟前下载result.zip的屏幕截图:

result

第二种方法:

function downloadZipFile($url, $filepath){
     $fp = fopen($filepath, 'w+');
     $ch = curl_init($url);

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
     //curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
     curl_setopt($ch, CURLOPT_FILE, $fp);
     curl_exec($ch);

     curl_close($ch);
     fclose($fp);

     return (filesize($filepath) > 0)? true : false;
 }

答案 1 :(得分:0)

curl_init()之后加入以下代码行。我认为这样可行。

  

CURLOPT_RETURNTRANSFER :::   TRUE返回传输为字符串的返回值   curl_exec()而不是直接输出。

     

CURLOPT_USERAGENT ::要在HTTP请求中使用的“User-Agent:”标头的内容。

详细了解curl_setopt here

 $ch = curl_init(str_replace(" ","%20",$url));
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");