2015-05-03 75 views
0

我試圖用jquery的$ .post方法下載一個excel CSV文件,但我很難讓它工作。使用jquery post MVC下載文件

我可以看到服務器正在創建文件並將其發送回客戶端,但在此之後,我無法獲取文件實際下載。

我的jQuery的崗位職能如下:

$.post("/GenerateFile", { id: id, startDate: startDate, endDate: endDate }, function (data) { 

    window.location = data; 

}).fail(function (XMLHttpRequest, textStatus, errorThrown) { 

}); 

而我的服務器端功能如下:

public async Task<ActionResult> GenerateFile(string id, string startDate, string endDate) 
{ 
    try 
    { 
     // My logic to create the file here, this is of type Task<MemoryStream> 
     var outputFile = await CreateFile(sDate, eDate); 

     return File(outputFile, "text/comma-separated-values", "Download.csv"); 
    } 
    catch (Exception e) 
    { 
     return new HttpStatusCodeResult(400, e.Message); 
    } 
} 

當這個數據來自返回給客戶端,它會嘗試導航到一個使用來自CSV文件的數據的新頁面(如可在URL鏈接中看到的)與消息

Bad Request - Invalid URL 

HTTP Error 400. The request URL is invalid. 

文件生成本身沒有問題,因爲我可以在磁盤上本地創建文件,這只是當我嘗試使用瀏覽器下載文件時。

我見過指導,顯示此方法工作,但似乎有什麼,我錯過了停止下載工作。

回答

0

文件下載的工作方式與重定向類似。 Ajax方法(包括post)不處理重定向,只是按原樣返回服務器結果。在你的情況下,一個文件流。

而不是從帖子中返回文件,這需要你對實際的文件流(而不是URL)做一些事情,只需要post方法在服務器上創建一個臨時文件,然後返回一個URL到那個文件。

然後,當您將window.location設置爲文件URL時,它會根據您的需要進行下載。

這是一個非常標準的方法,但是之後需要處理刪除臨時文件。該策略包括:任何

  • 數據時到期檢查/所有的臨時文件被創建的任何文件時,/請
  • 僅具有每用戶可用1個臨時下載文件名
+0

感謝您的回答,我確信我可以使用window.location下載它,但它似乎並沒有像我想的那樣工作(在試圖找出幾個小時=。=之後)。無論如何,而不是在服務器上創建一個文件,我將該值存儲在會話中(按照本指南 - http://stackoverflow.com/questions/14138872/how-to-use-sessions-in-an-asp-net -mvc-4-application)並且現在可以完美下載。 – Hanho

+0

假設您只需將整個文件作爲編碼字符串傳遞,則「window.location」的大小限制非常小,因此永遠不會實用。雖然會話*將會*工作,但實際上不推薦用於大型數據項目,並且在多個服務器上肯定不會很好地工作(例如,一個實際的生產環境中最少有2個服務器實例) –

+0

啊,對了,謝謝你的支持,當我們談論大數據項時,我們會談論大嗎?超過1兆? 5 megs? 100megs?另外,您能否簡要概述一下服務器實例的含義? (或關於這個的鏈接?) – Hanho