Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用cURL下载ZIP文件_Php_Curl_Zip_Fopen - Fatal编程技术网

Php 使用cURL下载ZIP文件

Php 使用cURL下载ZIP文件,php,curl,zip,fopen,Php,Curl,Zip,Fopen,我正在尝试使用cURL从给定的URL下载一个ZIP文件。 我收到了一个供应商的URL,我应该在那里下载一个ZIP文件。但是每次我尝试下载ZIP文件时,我都会看到一个页面,上面说我没有登录 我应该从中获取文件的url如下所示: https://www.tyre24.com/nl/nl/user/login/userid/USERID/password/PASSWORD/page/L2V4cG9ydC9kb3dubG9hZC90L01nPT0vYy9NVFE9Lw== 在这里,您可以看到USERI

我正在尝试使用cURL从给定的URL下载一个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时,似乎都会得到一个不正确的登录页面。有人能告诉我我做错了什么吗

似乎在给定的URL后面有一个重定向,这就是为什么我加入了cURL调用:
cURL\u setopt($ch,CURLOPT\u 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);

我做错什么了吗?

curl\u init()
之后包含以下代码行。我认为这会起作用

CURLOPT_RETURNTRANSFER: 如果为TRUE,则将传输作为返回值的字符串返回 而不是直接输出

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

阅读更多有关
curl\u setopt
的信息


curl\u init()
之后包含以下代码行。我认为这会起作用

CURLOPT_RETURNTRANSFER: 如果为TRUE,则将传输作为返回值的字符串返回 而不是直接输出

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

阅读更多有关
curl\u setopt
的信息

要通过
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");
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;
 }
几点意见:

  • 要从远程源获取数据,必须设置
    CURLOPT\u RETURNTRANSFER
    选项
  • 而不是后续调用
    fopen
    <代码>网站
您可以使用的功能 使用更方便的
文件内容


下面是几分钟前使用上述方法下载的带有
result.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");
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;
 }
要通过
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");
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;
 }
几点意见:

  • 要从远程源获取数据,必须设置
    CURLOPT\u RETURNTRANSFER
    选项
  • 而不是后续调用
    fopen
    <代码>网站
您可以使用的功能 使用更方便的
文件内容


下面是几分钟前使用上述方法下载的带有
result.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");
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;
 }


也许,您的意思是“上传”文件而不是“下载”?@RomanPerekhrest No I'm download如果您的意思是从外部源下载文件,那么
$fp=fopen('result.zip','w+)不符合要求sense@RomanPerekhrest是的,因为您从给定的url下载数据并将其写入result.zip,权限为w+。或者你有其他想法吗?URL中包含的密码是故意的?也许,你的意思是“上传”文件而不是“下载”?@RomanPerekhrest否我真的下载如果你的意思是从外部源下载文件,那么
$fp=fopen('result.zip','w+)不符合要求sense@RomanPerekhrest是的,因为您从给定的url下载数据并将其写入result.zip,权限为w+。或者你有其他想法吗?URL中包含的密码是故意的?不,抱歉,它仍然不起作用。我仍然得到相同的错误登录页面。然后请检查这些问题。在我将数据发布到这里之前,我已经使用了这些帖子,我只是添加了ssl版本来确保。另外一个我已经在我的代码中设置了超时(50)。所以这不是解决办法,还有什么我可以尝试的吗?不,对不起,它仍然不起作用。我仍然得到相同的错误登录页面。然后请检查这些问题。在我将数据发布到这里之前,我已经使用了这些帖子,我只是添加了ssl版本来确保。另外一个我已经在我的代码中设置了超时(50)。所以这不是解决方案,还有什么我可以尝试的吗?这已经是一个改进,我现在收到一个更大的文件。只是现在的问题是它被破坏了。所以当我试图打开下载的ZIP时,它会说。文件已损坏,无法打开。这是我可以解决的问题吗?现在你已经禁用了curlopt_followlocation。但这确实意味着它不会比给定的URL更进一步。但它必须更进一步,所以我启用了它。当我启用它时,我只会再次收到相同的不正确登录页面。当您将
downloadZipFile
函数调用的结果存储到变量中时,它会返回给您什么?它给出以下标题:HTTP/1.1 302 Found Date:Mon,2016年2月8日14:16:00 GMT服务器:Apache集Cookie:PHPSESSID=oo8rs47jcbt7e75ba2tghkj86eps9r75b57sn826rhvlb99v2lkjpmh8ms6hu1p2m2ja0sg86oia4ue5ca067a975a81itbddo1ko0;path=/Expires:Thu,1981年11月19日08:52:00 GMT缓存控制:无存储,无缓存,必须重新验证,后检查=0,预检查=0 Pragma:无缓存位置:/nl/nl/export/download/t/Mg=/c/MTQ=/Vary:接受编码内容长度:0内容类型:text/html;charset=UTF-8,如果我只存储downloadZipFile的结果,它将返回:1。我认为这意味着这是成功的。这已经是一个进步,我现在收到一个更大的文件。只是现在的问题是它被破坏了。所以当我试图打开下载的ZIP时,它会说。文件已损坏,无法打开。这是我可以解决的问题吗?现在你已经禁用了curlopt_follo