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



我有一个站点在我的本地主机上运行,但交换到生产服务器导致了一系列问题。我现在真的无法改变服务器并尝试处理它

我正试图从远程服务器下载一个文件。它使用.net返回一个包含一堆文件的Zip文件:

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

如果我在浏览器中输入URL,文件就会完美下载。但这台服务器在外面无法访问(我的笔记本电脑在VPN上可以访问(。

当从SO答案中被破解时,我的原始代码看起来是这样的,并且在我的localhost:上工作

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(,但它以字符串的形式返回文件(基本上是一堆jibberish-字符串显示了jibberih中的一些文件路径信息(。

标题显示了文件名,现在我需要:

  1. 从标头中获取文件名
  2. 使用文件名将文件下载到客户端
  3. 所有文件都是.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���������FolderNameFILE.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�����������FolderNameFILE.txL�PKS�

那么,如何将$body更改为ZIP文件(在Content Disposition中命名(以进行下载呢?

谢谢你的帮助。

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

因此,您要做的是设置一个标头,让客户端知道它正在发送什么。

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标签。

最新更新