我有一个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
答案 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("&");
}
编辑以回应评论:包含示例