2013-01-09 46 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