2013-10-09 214 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,但保持點擊處理程序向用戶提供簡短的反饋消息,感謝您的幫助! –