我正在尝试使用来自给定网址的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);
我做错了吗?
答案 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
的屏幕截图:
第二种方法:
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");