我正在尝试使用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函数。
如果没有我在源代码中输入网址,我还没有想出办法让它发挥作用。
感谢。
答案 0 :(得分:0)
我终于弄明白了这个问题。我在这里发布解决方案以供将来参考。
在我的第一次尝试中,我通过废弃cURL请求返回的html页面获取了我想要下载的文件的URL。
在我的第二次尝试中,我直接在php源代码中输入了url。
当我回到屏幕时,它们看起来完全一样。
然而,在玩了strlen和strpos后,我意识到第一个网址有“&”存储为“& amp”。两者在我的屏幕上看起来完全相同,但它们的存储方式不同。
为了解决这个问题,我更换了一行:
$url3a = $parts[0][0];
与
$url3a = htmlspecialchars_decode($parts[0][0]);
这个htmlspecialchars_decode函数用常规的“&”替换所有“& amp”。
我希望这有助于其他人。
感谢。