通过GET下载文件并返回引荐来源网址

时间:2016-07-09 19:40:40

标签: c# file

我通过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"];

问题是当Get请求发布到控制器时,响应是: enter image description here

如您所见,文件请求网址为:" 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");
        }

这里有什么不对?

2 个答案:

答案 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可能会否决它,但您可以设置文件类型如何处理它们。