使用JQuery将文件下载到ASP.NET MVC应用程序中的客户端上

时间:2009-06-22 16:21:08

标签: asp.net-mvc jquery

我有一个ASP.NET MVC控制器,其方法需要向客户端(浏览器)提供文件。使用JQuery $ .ajax调用调用控制器操作。控制器操作完成后,需要提示用户下载文件。

我在控制器方法中使用了Response.Transmitfile / Response.WriteFile,但两者都没有提示我在IE浏览器中下载文件,即使文件已经创建并且我也使用了正确的文件路径。

当我通过在浏览器中输入控制器URL直接调用相同的方法时,系统会立即提示我下载创建的文件。

如果此流程中缺少某些内容,有人可以告诉我吗?

我怀疑这是我在JQuery中调用控制器动作的方式。 如何使用JQuery Ajax调用的响应来确保提示客户端下载文件

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult CreatePresentation(string id)
    {
     //do something here , create the file and place in a location on the server itself
       string filename = Path.GetFileName(filePath);
        Response.ContentType = "APPLICATION/OCTET-STREAM";
        System.String disHeader = "Attachment; Filename=\"" + filename +
           "\"";
        Response.AppendHeader("Content-Disposition", disHeader);
        FileInfo fileToDownload = new FileInfo(filePath);
        Response.WriteFile(fileToDownload.FullName);
    }

在Javascript方面,这是我调用控制器动作的方式

function CreatePresentation()
{ 
// something here
     $.ajax({
   type: "POST",
   url: "http://localhost:4844/ActionBar/CreatePresentation",
   data:data
 });
} // end of function

1 个答案:

答案 0 :(得分:1)

当您使用$.ajax或其他任何AJAX机制时,您绕过正常的浏览器文件传输管道。它是触发浏览器的“保存此文件”对话框的主要管道,而不是AJAX的对话框。

要实现您的目标,您需要使用同步位置更改而不是异步位置:而不是使用$.ajax,只需设置document.location

function CreatePresentation()
{
    //snip code that creates a map called "data"
    var paramSnippets = [];
    for (item in data)
    {
        paramSnippets.push(item + "="+data[item]);
    }

    document.location = "http://localhost:4844/ActionBar/CreatePresentation" + "?" + paramSnippets.join("&");
}

编辑以回应评论:包含示例