【问题标题】:File Download not Saving into Downloads Folder文件下载未保存到下载文件夹
【发布时间】:2013-10-27 08:44:14
【问题描述】:

我希望从我的网络服务器下载带有下载进度信息的文件。为此,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 文件夹中,我的 PHP 脚本(包括这个 cURL 之一)驻留在该文件夹中。我也没有得到文件下载 另存为 对话框。

为了强制另存为对话框,我在脚本开头添加了以下标题:

header("Content-Disposition: attachment; filename=\"uploaded.pdf\"");
$fp = fopen(dirname(__FILE__) . 'uploaded.pdf', 'w+');
...

使用标头后,我得到“另存为”对话框,但是,该文件仍以静默方式下载到包含我的 PHP 脚本的文件夹中。在“下载”文件夹中,保存了文件大小为 0 的文件“uploaded.pdf”。

我的问题是,如何使 PHP cURL 正确下载文件并将它们放入 Downloads 文件夹并提供另存为对话框?

我用:

  • WAMP
  • Windows 7
  • PHP 版本 5.4.12
  • 卷曲版本 7.29.0

【问题讨论】:

    标签: php web-services curl download wamp


    【解决方案1】:

    通过使用file 函数,您实际上是在要求您的服务器保存文件,因此cURL 调用的结果最终会出现在您的PHP 文件夹中。

    如果我理解问题,您真正想要的是将 cURL 的结果发送回浏览器。通过发送header(...),您已经完成了一半 - 它让用户的浏览器知道文件即将到来并且应该被下载,您错过的步骤是发送带有标题的 cURL 数据。

    您可以在保存文件后回显文件的内容,或者更有效地(假设您不想要文件的额外副本)删除代码以在本地保存文件并删除 cURL 选项@ 987654324@。这将告诉 cURL 直接发送输出,因此它将成为下载的数据。

    希望有帮助!

    EDIT 一个简单的例子,它抓取一个本地文件 (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); 
    

    希望对您有所帮助!

    【讨论】:

    • 您好丹尼尔,感谢您的回答。请问我还有一些问题吗?首先,按照您的建议,我已将CURLOPT_RETURNTRANSFER 设置为false。但是,如何删除代码以在本地保存文件?我的意思是,CURLOPT_FILE 需要并打开文件句柄。要获得文件句柄,我必须打开一个文件进行保存。请给我一些时间给我看看你的例子好吗?
    • 没问题 - 我在回复中添加了一个简单示例。
    • @danelpsc:非常感谢。同样有效的是让CURLOPT_RETURNTRANSFER 设置为TRUE 并将内容输出为:print(curl_exec($ch));
    • 没问题。很高兴你最终到达那里!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-09-09
    • 2021-01-07
    • 2018-03-25
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多