我希望从我的网络服务器下载包含下载进度信息的文件。为此, PHP cURL 似乎是最佳选择。
但是,我很难将下载的文件放入 Downloads 文件夹中,其中通常会下载所有网络文件。我使用以下文件下载例程:
$fp = fopen(dirname(__FILE__) . 'uploaded.pdf', 'w+');
$url = "file:///D:/WEB/SAIFA/WWW/PickUpTest.pdf";
$ch = curl_init(str_replace(" ","%20", $url));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024*8);
curl_setopt($ch, CURLOPT_NOPROGRESS, false );
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback' );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_exec( $ch );
curl_close($ch);
fclose($fp);
unset($fp);
我的问题是,而是 Downloads 文件夹,该文件被静默下载到我的WWW文件夹中,其中包含此cURL文件的PHP脚本驻留在该文件夹中。我既没有文件下载另存为对话框。
要强制另存为对话框,我在脚本的开头添加了以下标题:
header("Content-Disposition: attachment; filename=\"uploaded.pdf\"");
$fp = fopen(dirname(__FILE__) . 'uploaded.pdf', 'w+');
...
使用标题后,我得到了“另存为”对话框,然而,该文件仍然使用我的PHP脚本静默下载到该文件夹中。在Downloads文件夹中,保存文件大小为0的文件'uploaded.pdf'。
我的问题是,如何让PHP cURL正确下载文件并将它们放入 Downloads 文件夹并提供另存为对话框?
我用:
答案 0 :(得分:2)
通过使用file
函数,您实际上要求服务器保存文件,以便cURL
调用的结果在PHP文件夹中结束。
如果我理解了这个问题,你真正想要的是将cURL的结果发送回浏览器。通过发送header(...)
- 您可以让用户的浏览器知道文件即将到来并且应该下载,您已经到了一半了,您错过的步骤是发送带有标题的cURL数据。
您可以在保存文件后回显该文件的内容,或者更有效地(假设您不需要文件的额外副本),删除代码以在本地保存文件并删除cURL选项{ {1}}。这将告诉cURL直接发送输出,因此它将成为下载的数据。
希望有所帮助!
编辑抓取本地文件(CURLOPT_RETURNTRANSFER
)并将其发送到用户浏览器(C:\test.pdf
)的简单示例。
uploaded.pdf
希望有所帮助!