用PHP发出下载文件

时间:2016-04-03 06:12:25

标签: php

我正在尝试使用PHP和cURL下载文件。我通过一系列cURL请求获取了下载文件的URL。

当我尝试下载文件时,我得到一个空文件。请参阅下面的相关代码:

...
$output = curl_exec($ch); 
curl_close($ch);
$regex = '/\b(https?|ftp|file):\/\/resources\.lendingclub\.com\/secure[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $output, $parts);
$url3a = $parts[0][0];
OutputMsg($url3a); //print the content of $url3a
DownloadFile($url3a, 'testfile.zip'); //downloads the file using a cURL request
...

这将创建具有ZERO字节的文件testfile.zip。并将以下内容输出到屏幕:

https://resources.lendingclub.com/secure/LoanStats3a_securev1.csv.zip?signature=cmu73mJsyNhznZMBH6B%2FsFjoNuE%3D&issued=1459663950631

如果我添加一行(见下文)

...
$output = curl_exec($ch); 
curl_close($ch);
$regex = '/\b(https?|ftp|file):\/\/resources\.lendingclub\.com\/secure[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $output, $parts);
$url3a = $parts[0][0];
//line added below
$url3a = 'https://resources.lendingclub.com/secure/LoanStats3a_securev1.csv.zip?signature=cmu73mJsyNhznZMBH6B%2FsFjoNuE%3D&issued=1459663950631';
OutputMsg($url3a); //print the content of $url3a
DownloadFile($url3a, 'testfile.zip'); //downloads the file using a cURL request
...

正确下载文件,屏幕输出与以前相同:

https://resources.lendingclub.com/secure/LoanStats3a_securev1.csv.zip?signature=cmu73mJsyNhznZMBH6B%2FsFjoNuE%3D&issued=1459663950631

我不知道为什么上面的第一个例子不起作用而第二个例子不起作用。我唯一做的就是输入网址并将其分配给变量。

我可以提供更多代码,包括DownloadFile函数。

如果没有我在源代码中输入网址,我还没有想出办法让它发挥作用。

感谢。

1 个答案:

答案 0 :(得分:0)

我终于弄明白了这个问题。我在这里发布解决方案以供将来参考。

在我的第一次尝试中,我通过废弃cURL请求返回的html页面获取了我想要下载的文件的URL。

在我的第二次尝试中,我直接在php源代码中输入了url。

当我回到屏幕时,它们看起来完全一样。

然而,在玩了strlen和strpos后,我意识到第一个网址有“&”存储为“& amp”。两者在我的屏幕上看起来完全相同,但它们的存储方式不同。

为了解决这个问题,我更换了一行:

$url3a = $parts[0][0];

$url3a = htmlspecialchars_decode($parts[0][0]);

这个htmlspecialchars_decode函数用常规的“&”替换所有“& amp”。

我希望这有助于其他人。

感谢。