2013-01-09 62 views
5

我希望客戶端下載單擊按鈕時存儲在我的數據庫中的文件。 我發送這個ajax請求,並從服務器端採取它。Extjs Ajax文件下載請求C#MVC

EXTJS:

downloadFile: function (a, b, c) { 
    var feed_id =this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
    Ext.Ajax.request({ 
     url: '/Feed/Download', 
     method: 'GET', 
     params: { 
      fileID: feed_id, //this.form.getComponent('file').value, 
     }, 
     failure: function (response) { 
      alert('failed !'); 
     }, 
     success: function (response) { 
      alert('success!'); 
     }, 
    }); 
}, 

然後滿足與該代碼塊請求。

C#:

public void Download(string fileID){ 
    Response.ContentType = "application/force-download"; 
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"Logo1.jpg\""); 
    Response.BinaryWrite(data); 
    Response.End(); 
} 

當我檢查網絡螢火蟲,看來我的要求與這些參數成功返回。

Cache-Control private 
Content-Disposition attachment; filename="Logo1.jpg" 
Content-Type application/force-download 
Date Wed, 09 Jan 2013 12:51:54 GMT 
Server Microsoft-IIS/8.0 
Transfer-Encoding chunked 
X-AspNet-Version 4.0.30319 
X-AspNetMvc-Version 4.0 
X-Powered-By ASP.NET 
X-SourceFiles =?UTF-8?B?RTpcVXRrdUNhblxQcm9qZWN0c1xURlNcQlRPTVxCVE9NXEZlZWRcRG93bmxvYWQ=?= 

雖然返回成功,但下載無法啓動。我閱讀了很多問題和文章,但大多數答案都說添加強制下載標題可以解決問題。我錯過了哪一點?謝謝。

+1

你究竟在這裏問什麼?目前尚不清楚。 – Liam

+0

下載不在服務器端啓動?我無法開始。 Firebug中的響應字段似乎充滿了一些數據,但沒有下載。 – tkcn

回答

2

要處理,你應該使用所提供的幫助

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult
  • 之一下載

大部分時間我都在使用System.Web.MVC.FileStreamResult mayself。使用它像

FileStreamResult result = new FileStreamResult(stream, contentType); 
result.FileDownloadName = filename; // name of the downloaded file 

更新只需根據您的修改

使用XHR請求無法開始下載一些相關信息。但至少有兩種方法可以如何做到這一點:

  • 如果文件路徑是固定,你知道它的Ajax調用成功處理程序中設置top.location.href = "YourPath";。 [Infos about top.location.href]
  • 如果您即時創建文件並希望返回它,您應該創建一個隱藏的iframe並向其中注入一個表單,然後執行請求。
+2

+1。我使用'返回文件(照片,「image/jpg」);'從數據庫中的照片是一個字節[]。 – A1rPun

+0

@tkcn我添加了一些關於Filedownloads的信息,涉及到我的文章的AJAX調用。他們可能會感興趣。 – sra

+0

謝謝,我已經使用了location.href。但學習iframe選項是一件好事。謝謝。順便說一句,如果你低調,對你感到羞恥。但如果你沒有,對我感到羞恥:D – tkcn

1

經過一番搜索,我發現location.href做同樣的事情,並打開一個下載對話框。應該將相同的標題添加到來自服務器的響應中。但是,我仍然不知道爲什麼其他方法不起作用。

var feed_id = this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
location.href = '/Feed/Download?fileID=' + feed_id; 

這解決了我的問題。

+0

有可能傳遞這樣的參數。 – tkcn