我正在尝试下载文件。它“似乎”一切正常,没有引发异常。
我正在通过一个简单的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);
答案 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回调返回文件。但是,您可以返回一个包含文件名的字符串,并将文件内容作为字节数组存储在TempData
或Session
中:
[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" });
}
接下来,使用success
或window.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();
}
}
如果您以正确的方式进行所有操作,则文本文件应该可以下载。