2012-06-21 63 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