我希望从Web服务器上下载带有下载进度信息的文件。为此,PHP cURL似乎是最佳选择。
但是,我很难将下载的文件放置在通常会下载所有Web文件的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);
我的问题是,将文件无提示下载到我的WWW文件夹中,而不是下载文件夹,我的PHP脚本(包括该cURL)驻留在该文件夹中。我也没有“文件下载另存为”对话框。
为了强制“另存为”对话框,我在脚本的开头添加了以下标头:
header("Content-Disposition: attachment; filename=\"uploaded.pdf\"");
$fp = fopen(dirname(__FILE__) . 'uploaded.pdf', 'w+');
...
使用标题后,我将看到“另存为”对话框,但是该文件仍使用我的PHP脚本静默下载到该文件夹中。在“下载”文件夹中,保存了文件大小为0的文件“ uploaded.pdf”。
我的问题是,如何使PHP cURL正确下载文件并将其放入“下载”文件夹并提供“另存为”对话框?
我用:
通过使用这些file
功能,您实际上是在要求服务器保存文件,这样才有可能将cURL
调用结果保存在您的PHP文件夹中。
如果我理解问题,您真正想要的是将cURL的结果发送回浏览器。通过发送header(...)
-,您就已经到达一半了,它可以使用户的浏览器知道文件正在下载,应该下载该文件,而您错过的步骤是发送带有标头的cURL数据。
保存文件后,您可以回显文件的内容,或者更有效地(假设您不需要文件的额外副本),删除代码以将文件保存在本地,并删除cURL选项CURLOPT_RETURNTRANSFER
。这将告诉cURL直接发送输出,因此它将成为下载数据。
希望对您有所帮助!
编辑一个简单的示例,它获取一个本地文件(C:\test.pdf
)并将其发送到用户的浏览器(如uploaded.pdf
)。
<?php
header("Content-Disposition: attachment; filename=\"uploaded.pdf\"");
// Get a FILE url to my test document
$url = 'file://c:/test.pdf';
$url= str_replace(" ","%20", $url);
$ch= curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_exec( $ch );
curl_close ($ch);
希望能有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句