2012-06-21 61 views
0

我使用readfile();开始下载并且它工作得很好,但是当尝试使用JavaScript来检查用户是否可以下载文件时,它不会开始下载,而是显示文件的二进制代码。我想要它下载文件。PHP readfile();和JavaScript

我用它来检查,如果用户可以下载该文件:

http.open("GET", "includes/checkdownload.php", true); 

checkdownload.php我有这个

header('Cache-Control: public'); 
header('Content-Transfer-Encoding: binary'); 
header("Content-Type: application/pdf"); 
header('Content-Disposition: attachment; filename="file.pdf"'); 
ob_clean(); 
flush(); 
readfile("file.pdf"); 

回答

3

您不能启动一个下载这样有一个Ajax请求。您可以使用Ajax请求检查文件的可用性(您应该使用HEAD来处理大文件以避免下载整个文件),但您需要使用window.open才能真正打开保存文件对话框。

window.open('includes/checkdownload.php'); 

或者,如@Derek指出,你可以使用一个,或者您也可以通过设置window.location.href重定向,或者你可以使用window.showModalDialog了。任何会在浏览器中的某处打开该URL的内容。

+0

或'iframe'。 –

0

您将需要一个代理脚本来告诉你该文件是否有效。因此,不要在文件上执行http.open,而是在服务器上调用一个脚本,如果该文件可以下载或不能下载,该脚本将返回一个断言。

例如:

$.get('includes/candownload.php', function(data){ 
    if(data == 'ok'){ 
     window.location.href = "includes/checkdownload.php"; 
    }else{ 
     alert('Cannot download your file'); 
    } 
) 

而在你的PHP文件 “candownload.php”

header('Cache-Control: public'); 
header('Content-Transfer-Encoding: binary'); 
header("Content-Type: text/plain"); 
ob_clean(); 
flush(); 
if(file_exists("file.pdf")){ echo 'ok'; }else{ echo 'no'; } 
+0

我用window.location.href替换了http.open,它可以工作,但它重定向到checkdownload.php,我可以停止重定向吗? – Chris

+0

你需要阅读并理解我们正在说的话以及你正在做什么来解决这个问题,如果你只是加快整个过程并且假设某件事会是正确的,我们就无法帮到你了。好lucj –

+0

对不起,我通过添加一个隐藏的iframe来解决问题。 – Chris