PHP cURL 文件以字符串形式返回,如何更改为下载?

PHP cURL file returned as string, how to change to download?

我有一个网站在我的本地主机上运行,​​但切换到生产服务器导致了令人头疼的问题。我目前无法真正更改服务器并尝试处理它。

我正在尝试从远程服务器下载文件。它使用 .net 来 return 一个包含一堆文件的 Zip 文件:

$url = 'https://myremoteserver.com/getFiles?model=12345&Files=1,2,3,4';

如果我在浏览器中输入 URL,文件会完美下载。但是这个服务器不能从外面访问(我的笔记本电脑可以在 VPN 上访问)。

虽然从 SO 答案中拼凑而成,但我的原始代码看起来像这样并且可以在我的本地主机上运行:

ob_start();
$filepath= $url;    //your folder file path
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition:attachment;filename=".$filename);

while (ob_get_level())
{
    ob_end_clean();
}
readfile($filepath);
exit;

在服务器上,我根本没有收到任何回应。追那条尾巴,看来 security/SSL 正在阻止它工作。

我能够使此代码正常工作(但使用 CURLOPT_SSL_VERIFYHOST、false 和 CURLOP_SSL_VERIFYPEER、false),但它 return 将文件作为字符串(基本上一堆乱码 - 该字符串在乱码中显示了一些文件路径信息。

header显示的是文件名,现在我需要:

  1. 从 header
  2. 中获取文件名
  3. 使用文件名将文件下载到客户端。
  4. 所有文件都是 .zip

PHP 文件:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

//Need to figure out how to  fix this too!
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

var_dump($header);
echo('</br></br>');
//File Name:
echo($body);

回应:

string(409) "HTTP/1.1 200 OK Cache-Control: private Content-Type: application/zip Server: Microsoft-IIS/8.5 Access-Control-Allow-Origin: * Set-Cookie: ASP.NET_SessionId=rx1zv2ihyhui4eaqp2jkwtv1; path=/; HttpOnly; SameSite=Lax Content-Disposition: attachment; filename = 2012-08-16-MORE-FILE-NAME.zip X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 10 Feb 2022 22:17:30 GMT Content-Length: 868 "

PK-/�JT���������FolderName\FILE.txtL���n�0�Olbi��E�^�L[��M��f�]�Dm��H�yP)�!M�N��^ xނwA���m�Ŏ�o;�#'�O��縃�sX�x�}�6j�����!+�Z}[�ʯ�����;:`�)���s����$o�k��ˬw�of�e�ca#�-��3K��[��=@4�F��"�-4�����n��T��UGc��DC�bo���n1��U�·��%y��~�-�OmR��YZ��gn�A�#d�&u;��x��V�0�R�%�9����wny9V^~�B�f�����"Sm:)�)�j�ٱeq����n�P���ލ\@ٰ+�3����-�u�~`�y�b��b��}�o�έ� ��68�<�s�m����;B�F,7�{%��!�}�]�%=�&פ������[�s�U��n�m�;��`U��,��)�N� �N���~o�-��Ywcay!]�A��#p0�NI6�W�7�&bt%v��v�8�O��6�n,Ǘ~�/Kmtܓq,W�� /L�hC#4�C�U������D�mVK�"M�# k�Zrv��S�!���o�ܠ�w2H:�G�a[�Hc����K�㫷�/����ٮ�v{R��\-�j���5���vvW����c}@b����)�����o�����~-��u���$v�b��L�j��"���B��#�K`�.��K�� ���PK3-/�JT�����������FolderName\FILE.txL�PKS�

那么如何让 $body 更改为 ZIP 文件(在内容配置中命名)以供下载?

感谢您的帮助。

据我了解,您希望 PHP 脚本将 zip 文件作为下载文件提供给客户端。

所以你要做的是设置一个header让客户端知道它正在发送什么。

header("Content-Type: application/zip");

这应该会导致大多数浏览器下载该文件,但这实际上取决于客户端对该 mime 类型具有的处理程序。要肛门,你可以使用所有这些 headers:

header("Content-Type: application/force-download");
header("Content-Type: application/download");
header("Content-Type: application/zip");

那么您可能想要为下载指定一个文件名,这样它就不会以您的 php 脚本命名:

header("Content-Disposition: attachment;filename=".$file_name);

然后您可以从您的 CURL 请求中输出 body。

echo($body);

你不想输出其他任何东西,所以没有 var_dump($header);或回应任何 html 标签。