响应对象未实现要在ASP.NET MVC框架中下载的文件

时间:2018-09-04 18:48:33

标签: c# jquery asp.net-mvc

我正在尝试下载文件。它“似乎”一切正常,没有引发异常。

我正在通过一个简单的jQuery $.ajax调用从前端调用动作控制器。

我的代码怎么了?

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.WriteLine("Line 1");
tw.WriteLine("Line 2");
tw.WriteLine("Line 3");
tw.Flush();
byte[] bytes = ms.ToArray();
ms.Close();

Response.Clear();
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment; filename= YourFileName.txt");
Response.BinaryWrite(bytes);
Response.End();

return Json(resultado, JsonRequestBehavior.AllowGet);

2 个答案:

答案 0 :(得分:1)

将您的代码更改为此代码,它应该可以工作。

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.WriteLine("Line 1");
tw.WriteLine("Line 2");
tw.WriteLine("Line 3");
tw.Flush();
byte[] bytes = ms.ToArray();
ms.Close();

return File(bytes, "text/plain", "YourFileName.txt");

如果在某些浏览器中会自动打开文本文件,而您可以尝试打开“ application / octet-stream”内容类型hack ..因此,最后一行应该像这样,

return File(bytes, "application/octet-stream", "YourFileName.txt");

答案 1 :(得分:0)

您应该知道的第一件事:即使使用Response实例,也无法直接从AJAX回调返回文件。但是,您可以返回一个包含文件名的字符串,并将文件内容作为字节数组存储在TempDataSession中:

[HttpPost]
public ActionResult ActionName(...)
{
    byte[] bytes;

    // other logic here

    using (var ms = new MemoryStream())
    {
        TextWriter tw = new StreamWriter(ms);
        tw.WriteLine("Line 1");
        tw.WriteLine("Line 2");
        tw.WriteLine("Line 3");
        tw.Flush();
        bytes = ms.ToArray();
    }

    TempData["bytes"] = bytes; // add this line

    return Json(new { fileName = "YourFileName.txt" });
}

接下来,使用successwindow.location设置为指向要下载文件的操作名称的URL处理AJAX调用的window.location.href部分:

$.ajax({
    type: 'POST',
    url: '@Url.Action("ActionName", "ControllerName")',
    data: ...,
    success: function(result) {
        window.location = '@Url.Action("DownloadFile", "ControllerName")' + '?fileName=' + result.fileName; 
    }
});

最后,使用HTTP GET 方法创建一个控制器,并使用先前存储在TempData / Session中的字节数组返回FileResult

[HttpGet]
public FileResult DownloadFile(string fileName)
{
    if (TempData["bytes"] != null)
    {
        var content = TempData["bytes"] as byte[];
        return File(content, "application/octet-stream", fileName);
    }    
    else
    {
        return new EmptyResult();
    }
}

如果您以正确的方式进行所有操作,则文本文件应该可以下载。