Curl PHP从动态链接获取/下载文件


Curl PHP getting/download file from dynamic link

需要使用cURL从动态生成的链接下载

链接:something.com/fileid=hgkjfdhgfhdg

如果访问直接链接,它将显示下载框(文件保存选项)。

但如果使用CURL或file_get_contents,则仅返回文件名。

$URL = https://somewebsite.com/fileid=hgkjfdhgfhdg
$fp = fopen("test.txt", 'w');
$c = curl_init($URL);
curl_setopt($c, CURLOPT_FILE, $fp);  
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);  
$contents = curl_exec($c);
$info = curl_getinfo($c);
curl_close($c); 
fclose($fp);

动态链接(test.txt)中的文件名是已知的。

URL=https://storage-ec2-32.sharefile.com/download.ashx?dt=dtca3192857a45452c84bd14e7500c7f46

问题是由于您正在连接到HTTPS URL,而cURL库无法找到证明ShareFile证书真实性所需的根CA证书捆绑包。因此,cURL在安全方面起作用,并在启动文件传输之前中止连接。

解决此问题的最佳方法是将PHP.ini中的curl_cainfo PHP配置开关设置为包含所需所有CA证书的文件的绝对路径(根据描述curl配置开关的PHP帮助页面),然后重新启动服务器。

如果您无法做到这一点,您可以通过添加来完全禁用SSL证书验证

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE);

到您的代码,就在$contents = curl_exec($c);行的上方。

请注意,最后一种解决方案是不安全的,可能会为中间人的攻击打开大门——将其作为最后手段。

首先,应该将CURLOPT_HEADER设置为0,以防止输出中出现标头。其次,您确定要打开的文件是可写的吗?您应该检查fopencurl_setopt的结果。