我想使用cURL从asp.net编写的网站下载excel文件。它使用“ post”方法的形式。如果使用浏览器,单击提交后可以获取文件,但是使用cURL时失败。这是我的代码:
$curl = new Curl();
$curl->setOptions([CURLOPT_COOKIE => $cookie]);
$res = $curl->run($url);
if (!$curl->error) {
$xpath = $curl->xpath($res);
$inputs = $xpath->evaluate('//form//input | //form//select');
if ($inputs) {
$postFields = [];
for ($i = 0; $i < count($inputs); $i++) {
$postFields[$inputs->item($i)->getAttribute('name')] = $inputs->item($i)->getAttribute('value');
}
$header = [
'Content-Length: ' . strlen(http_build_query($postFields)),
// 'Referer: path/to/website'
];
$file = fopen('tkb.xls', 'w+');
if ($file === false) die('could not open file to write');
$curl->setOptions([
CURLOPT_VERBOSE => 1,
CURLOPT_HEADER => 1,
CURLOPT_POSTFIELDS => http_build_query($postFields),
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_COOKIE => $cookie,
CURLOPT_FILE => $file,
// CURLOPT_HTTPHEADER => $header,
// CURLOPT_REFERER => 'path/to/website.aspx',
// CURLOPT_POST => 1,
// CURLOPT_POSTREDIR => 2,
// CURLOPT_MAXREDIRS => 1,
]);
$res = $curl->run($url, 'post');
if(!$res) echo $curl->message;
else {
fwrite($file, $res);
fclose($file);
}
$res = !$curl->error;
$curl->close();
return $res;
}
}
else die($curl->message);
当我将CURLOPT_FOLLOWLOCATION设置为0时,服务器返回响应代码 302找到,并且对象移到了此处 ,并具有与上一页相同的链接。 当我将CURLOPT_FOLLOWLOCATION设置为1时,服务器返回 411所需长度错误。我尝试将$ header与选项CURLOPT_HTTPHEADER一起使用,但不起作用,超时后代码被破坏。 我使用CURLOPT_VERBOSE来查看日志:按照重复的位置重定向同一页面的无穷大。我不明白为什么。 我还搜索了类似“使用curl时出现302错误”,“ 411错误”之类的内容,但没有更多运气。谁能帮我? (对不起,我的英语)