2013-10-09 42 views
0

此下载一个文件是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"; 
    }; 

这不是什么outputing,没有文件被下载。我知道PHP脚本正在工作,正在被调用。

+7

不发送ajax请求。只需重定向到下载。或者更好的做法是,让按钮成为锚标签并删除javascript。 –

+0

[如何使用PHP单击文件的名称来下载文件?](http://stackoverflow.com/questions/4518702/how-to-download-a-file-on-clicking-the-name -of-file-using-php) – showdev

回答

3

请勿使用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,那么该按钮就没用了,但是一个链接可以正常工作。)

+0

就是这样!我删除了AJAX,但保持点击处理程序向用户提供简短的反馈消息,感谢您的帮助! –