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

标签 php ssl curl

我有一个在我的本地主机上运行的站点,但是切换到生产服务器引起了令人头疼的问题。此时我无法真正更改服务器并尝试处理它。
我正在尝试从远程服务器下载文件。它使用 .net 返回一个包含一堆文件的 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;
在服务器上,我根本没有得到任何回应。追逐那条尾部,看起来安全性/SSL 正在阻止它工作。
我能够让这段代码工作(但使用 CURLOPT_SSL_VERIFYHOST、false 和 CURLOP_SSL_VERIFYPEER、false),但它以字符串形式返回文件(基本上是一堆乱码 - 字符串显示乱码中的一些文件路径信息) .
标题显示文件名,现在我需要:
  • 从标题中获取文件名
  • 使用文件名将文件下载到客户端。
  • 所有文件均为 .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 文件(在 Content Disposition 中命名)以进行下载?
    感谢您的帮助。

    最佳答案

    据我了解,您希望您的 PHP 脚本将 zip 文件作为下载文件提供给客户端。
    因此,您要做的是设置一个 header ,让客户端知道它正在发送什么。

    header("Content-Type: application/zip");
    
    这应该会导致大多数浏览器下载该文件,但这实际上取决于客户端针对该 mime 类型拥有的处理程序。要成为肛门,您可以使用所有这些标题:
    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 请求中输出正文。
    echo($body);
    
    你不想输出任何其他东西,所以没有 var_dump($header);或回显任何 html 标签。

    关于PHP cURL 文件以字符串形式返回,如何更改为下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71073101/

    相关文章:

    php - 如何在 PHP 中发出异步 GET 请求?

    PHP REST 客户端 API 调用

    php - 如何使用 PHP 获取任何网站的 HTML 源代码?

    javascript - 计算JS中从php解析出来的变量

    ssl - 如果我们更新 SSL 证书并花时间部署到服务器,网站将无法运行吗

    使用 Swift 和 NSURLSession 固定 iOS 证书

    ssl - x509: 构建 docker 镜像时由未知权威签署的证书

    php - 如何将我的数据从一个按钮返回到另一个 php 页面

    javascript - 如何测量 ajax 调用的进度?在 Php 中使用 jquery/ajax

    php - ionic : unable to send form data to php on MAMP server