具體功能為,在文件數據列表中選擇一行,點擊表格上方的下載按鈕,下載文件。由於表格中不包含文件路徑,只能取到在數據庫表中的ID,所以具體實現就是這樣:首先點擊一行,獲取點擊的一行數據的ID,用Ajax傳值到Ashx服務文件,在Ashx中根據ID取到文件路徑,轉換為服務器虛擬路徑后返回到Web頁面。在Web頁面中用Ajax進行下載。
一開始嘗試過直接在Ashx服務處理中response.writeFile(),結果不能下載,原因可能是因為Ajax請求,而返回的時候直接返回到了Ajax的回調函數中。於是只好取到文件的路徑后直接返回回調函數,然后在回調函數路面下載。
在網上找到好多種下載方式,用jQuery來處理文件路徑最多的建議就是window.href=url,可能很多需求並不是下載文件,而是重定向吧。如果下載文件這樣寫也是可以的,只不過用戶體驗不好,點擊下載后就跳轉頁面了,下載完還要后退或者怎么樣。所以我就沒有用這種方式。
下面還是講講我用的方法吧,比較巧妙。就是先在頁面中添加一個隱藏的a標簽,讓其隱藏,在獲取到文件路徑的時候賦值給a的href,然后觸發a標簽的click事件就行了。
<a id="dp" href="" style="display: none;"><span id="fp"></span></a>
這里a標簽如果直接觸發的話沒有用,所以在其中加了一個span標簽,觸發的span標簽的click事件就可以了。
function Download() { //在選擇某行的時候給rowid賦值,這里取值即可 var id = $("#rowid").val(); $.ajax({ type: "POST", url: "Download.ashx", dataType: "json", data: { action: "DownLoad", id: id }, success: function (data) { if (data != null || data != "") { //獲取返回的文件路徑 var path = data[0]["path"].toString(); //給a標簽賦值 $("#dp").attr("href", path); //這里的fp是a標簽中的span標簽的ID $("#fp").click(); } else { alert("文件不存在"); } } }); }
這的確是一個比較實用的小訣竅,這下再也不用擔心Ajax文件下載的問題啦。
