【问题标题】:Download a file by clicking a button通过单击按钮下载文件
【发布时间】:2013-10-09 16:52:58
【问题描述】:

这是 HTML:

<button name="download">Download</button>

我希望用户在单击此按钮时下载文件。为此,我使用了以下 Ajax 请求:

$parent.find('button[name=download]').click(function () {
    $.ajax({
        url: "download.php",
        sucess: function(data, status, jqXHR){
            $console.text('Download efetuado');
        },
        error:function(xhr, status, error){
            $console.text(xhr.responseText);
        }
    });
});

download.php 在哪里:

if (file_exists($myFile)){
        header ("Content-Type: application/json");
        header ("Content-Disposition: attachment; filename=$fileName");
        header("Content-Length: " . filesize("$myFile"));
        $fp = fopen("$myFile", "r");
        fpassthru($fp);
    } else {
        echo "no file exists";
    }; 

这没有输出任何东西,也没有下载任何文件。我知道 PHP 脚本正在运行并且正在被调用。

【问题讨论】:

标签: php jquery


【解决方案1】:

不要使用 AJAX 下载文件。并不是它不能发出请求并接收响应,只是它实际上没有任何有意义的方法来处理响应。

另一方面,浏览器本身可以。

因此您可以将浏览器定向到请求:

$parent.find('button[name=download]').click(function () {
    window.location.href = 'download.php';
});

如果download.php 发送Content-Disposition: attachment; 的响应,则不会以任何方式卸载或修改页面。浏览器将完全独立于当前页面上下文来处理此请求的响应,并且在处理完响应之后,页面上下文将保留。

(当然,除非浏览器配置来处理该响应,例如始终显示它而不是提示保存它。但是在代码中您无能为力。 )

此时,事实上,完全删除 JavaScript 并使其成为普通链接更有意义,这将完成同样的事情:

<a href="download.php">Download</a>

您可以将其设置为看起来像一个按钮,它可能比运行 JavaScript 代码的实际按钮更易于访问。 (如果浏览器没有启用 JavaScript,那么按钮将无用,但链接会正常工作。)

【讨论】:

  • 就是这样!我删除了 AJAX,但保留了点击处理程序以向用户提供简短的反馈消息,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多