2011-11-09 57 views
1

ASP.NET的XMLHttpRequest下載文件正在嘗試使用XMLHttpRequest來實現文件的下載...但我沒有得到文件對話框或任何迴應。我有調試處理程序,沒有錯誤。在你的代碼使用處理器

function download(id) 
    { 
    try 
    { 
     var xmlHttp=new XMLHttpRequest(); 
     xmlHttp.open("GET","DownloadFileHandler.ashx?id=" + id,false);  
     xmlHttp.send(); 
      xmlHttp.onreadystatechange=function() 
    { 
     //if request has been entertained and response is returned from server 
     if(xmlHttp.readyState==4) 
     {  
      alert("aq"); 

     } 
    } 
} 



    catch (ex) 
    { 
    alert("Browser does not support ajax"); 
    } 

    } 
} 

我的處理程序

context.Response.AppendHeader("content-disposition", "attachment; filename=" + name); 
context.Response.ContentType = type; 
context.Response.WriteFile(path); 
context.Response.End();  
+0

不會異步工作... – Aliostad

+0

什麼意思雅? – user2514963

+1

Ajax無法下載文件。 – Aliostad

回答

0

通知你:

var xmlHttp=new XMLHttpRequest(); 

因此,很明顯AJAX使用基於XML的HTTP請求。這是一個不同於文件下載請求的協議。文件下載是一個二進制http請求。

有點像講兩種不同的語言時,有沒有翻譯。不工作...

所以,一個解決方案是創建一個指向一個ashx的處理程序,可以獲取該文件並將其發送給客戶端

1

這樣的鏈接,顯然AJAX使用基於XML的http請求。這是與文件下載請求不同的 協議。文件下載是一個二進制 http請求。

首先,雖然XmlHttpRequest對象可以將數據解析爲XML,但您也可以獲取完整數據,無論是否爲二進制數據。你可以把它解析成你想要的任何東西。

其次,它不是一個不同的協議。該協議是HTTP。在這兩種情況下,HTTP都會傳輸數據,並進行內容協商。第三,HTTP GET請求(在兩種情況下都是同一種請求)可以完全獨立於請求的生成方式返回二進制或文本數據。一個請求可以通過標籤來生成,或者一個用戶點擊一個鏈接,或者一個XMLHttpRequest,以及內容類型(二進制或文本)是完全獨立的是如何生成的請求。

您不能下載使用XMLHttpRequest的一個文件,而是必須使用特定的瀏覽器擴展,如nsIWebBrowserPersist的真正原因,是瀏覽器選擇了不注重內容處理標頭時讀取數據從返回一個XMLHttpRequest,它們在讀取頂級頁面數據時的方式(或者 - 您可以通過隱形iframe獲取數據來觸發下載)

就個人而言,我認爲這是Web瀏覽器的一個糟糕的選擇,因爲沒有額外的安全性,只爲開發人員帶來不便。有沒有辦法送接受:不是通過發出一個IFRAME或IMG元素GET請求,所以你無法控制內容協商其他頭或動詞。相反,您必須將HTTP協議轉換爲GET參數,這些參數讓我感到悲傷和不可靠。

有關nsIWebBrowserPersist的更多信息,請參閱https://developer.mozilla.org/en/Code_snippets/Downloading_Files