6

我希望客户端在单击按钮时下载存储在我的数据库中的文件。我发送这个 ajax 请求并从服务器端获取它。

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();
 }

当我用 firebug 检查网络时,似乎我的请求使用这些参数成功返回。

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=?=

虽然返回成功,但下载并没有开始。我阅读了很多问题和文章,但大多数答案都说添加 force-download 标头可以解决问题。我错过了哪一点?谢谢。

4

2 回答 2

3

要处理下载,您应该使用提供的帮助程序之一

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult

大多数时候我都在使用System.Web.MVC.FileStreamResult自我。像这样使用它

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

根据您的编辑更新一些信息

您无法使用 XHR 请求开始下载。但是至少有两种方法可以做到:

  • 如果文件路径是固定的,并且您知道它top.location.href = "YourPath";是在 ajax 调用的成功处理程序中设置的。[关于top.location.href的信息]
  • 如果您动态创建文件并想要返回它,您应该创建一个隐藏的 iframe 并在其中注入一个表单,然后执行请求。
于 2013-01-09T13:33:06.020 回答
1

经过一番搜索,我发现它location.href做同样的事情并打开一个下载对话框。应将相同的标头添加到来自服务器的响应中。但是,我仍然不知道为什么其他方法不起作用。

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

这解决了我的问题。

于 2013-01-09T18:34:25.110 回答