我正在尝试使用php将变量发布到远程服务器上的另一个php以及远程服务器上的文件中我想要读取该文件并强制下载。远程服务器上的文件不在公用文件夹上,这就是我需要先调用该文件的原因,因此它会进行身份验证并获取受保护的文件。
一切正常,但我没有收到任何档案。
在远程PHP上,我使用标准的readfile和头文件来下载文件。
我想也许问题出在CURL设置上,我正在使用标准的CURL调用当我调用CURL来下载文件时,是否需要使用任何特定的标题或设置?
这是我正在使用的CURL
$request = curl_init();
curl_setopt($request, CURLOPT_URL, $postURL);
curl_setopt($request, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($request, CURLOPT_VERBOSE, 0);
curl_setopt($request, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($request, CURLOPT_POST, 1);
curl_setopt($request, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($request);
curl_close($request);
其中$ postFields包含要在另一台服务器上进行身份验证和确认文件的变量。
在另一台服务器上,经过身份验证的php会执行正常的下载操作:
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$newFileName.'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');
readfile($path);
谢谢!
修改 嗨,我相信我发现了这个问题。问题是,当我通过jquery调用本地服务器php上的$ post时,curl中断了ajax调用
$.post('local.php', $(this).serialize(), function(data){
alert(data);
}
}, "json").fail(function() {
alert('error');
});
所以我必须弄明白如何在不破坏进程的情况下通过jquery调用local.php。 谢谢你的帮助!
答案 0 :(得分:1)
假设您在目标站点上使用基本HTTP身份验证 - 您可以使用选项CURLOPT_USERPWD
添加登录信息。
curl_setopt($request, CURLOPT_USERPWD, "$username:$password");
编辑:关于ajax调用 - 如果服务器返回错误,jQuery将执行fail
方法。此外 - 您在ajax调用中将json
指定为数据类型。我认为下载不会返回json。
编辑2 :我不认为通过$.post
下载是可能的,因为jQuery只知道xml
,html
之一, script
,json
,jsonp
,text
。您可以尝试通过ajax请求进行身份验证,让ajax响应返回下载URL,将浏览器重定向到该目标。或者您可以尝试使用隐藏的iframe进行下载。看一下这些帖子(here和here) - 这里将详细讨论这个问题。