我通过ajax发送请求,如果响应数据成功,我在ajax成功函数中发出GET请求:
success: function (data, status) {
if (!data["Success"]) {
alert("Error occurred: Cant read data properly," + data["Message"]);
return null;
}
window.location = '/Home/downloadanddelete?file=output.' + data["filetype"];
如您所见,文件请求网址为:" http://localhost:53091/Home/downloadanddelete?file=output.xml"
我希望下载这个" output.xml"文件并返回引荐来源页面网址。
这是控制器中的下载方法:
[HttpGet]
public ActionResult downloadanddelete(string file)
{
string fullName = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data", file);
if (System.IO.File.Exists(fullName))
{
return File(fullName, "application/xml");
}
return View("Index");
}
这里有什么不对?
答案 0 :(得分:3)
你需要改变两件事。在服务器代码中,您需要发送Content-Disposition
标头以指示内容是"附件"。在发送文件之前添加这些行:
var cd = new System.Net.Mime.ContentDisposition
{
FileName = "filename.xml",
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
其次,您应该使用window.location.assign(...);
而不是设置window.location
,以便在浏览器中获得更加无缝的体验。
答案 1 :(得分:2)
您可以使用标题类型" Content-Disposition"告诉浏览器最好下载并保存文件,而不是显示它。这里有一些信息:https://stackoverflow.com/a/20509354/1862405
对于您的具体情况,您需要使用附件处理,您可以使用AddHeader将其添加到控制器操作中:
HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=\"download.xml\"");
另一件事是Firefox可能会否决它,但您可以设置文件类型如何处理它们。