PHP - 使用CURL验证和下载远程文件

时间:2015-06-17 16:27:41

标签: php curl

我正在尝试使用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。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

假设您在目标站点上使用基本HTTP身份验证 - 您可以使用选项CURLOPT_USERPWD添加登录信息。

curl_setopt($request, CURLOPT_USERPWD, "$username:$password");

编辑:关于ajax调用 - 如果服务器返回错误,jQuery将执行fail方法。此外 - 您在ajax调用中将json指定为数据类型。我认为下载不会返回json。

编辑2 :我不认为通过$.post下载是可能的,因为jQuery只知道xmlhtml之一, scriptjsonjsonptext。您可以尝试通过ajax请求进行身份验证,让ajax响应返回下载URL,将浏览器重定向到该目标。或者您可以尝试使用隐藏的iframe进行下载。看一下这些帖子(herehere) - 这里将详细讨论这个问题。