在 ASP.net Core MVC 2.1 中创建文本文件并下载而不保存在服务器上

Posted

技术标签:

【中文标题】在 ASP.net Core MVC 2.1 中创建文本文件并下载而不保存在服务器上【英文标题】:Create text file and download without saving on server in ASP.net Core MVC 2.1 【发布时间】:2018-11-27 00:26:16 【问题描述】:

我找到了一种创建文本文件的方法,然后立即在浏览器中下载它,而无需在常规 ASP.net 中将其写入服务器:

Create text file and download

接受的答案使用:

using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8)) 
  writer.Write("This is the content");

我需要在 ASP.net Core 2.1 MVC 中执行此操作 - 尽管其中不知道 Response.OutputStream 是什么 - 我在 Google 上找不到任何帮助或其他方法来解决此问题。

我该怎么做?谢谢。

【问题讨论】:

【参考方案1】:

如果您只处理文本,则根本不需要做任何特别的事情。只需返回ContentResult

return Content("This is some text.", "text/plain");

这同样适用于其他“文本”内容类型,例如 CSV:

return Content("foo,bar,baz", "text/csv");

如果您尝试强制下载,您可以使用FileResult 并简单地传递byte[]

return File(Encoding.UTF8.GetBytes(text), "text/plain", "foo.txt");

filename 参数提示 Content-Disposition: attachment; filename="foo.txt" 标头。或者,您可以返回 Content 并手动设置此标头:

Response.Headers.Add("Content-Disposition", "attachment; filename=\"foo.txt\"");
return Content(text, "text/plain");

最后,如果您在流中构建文本,则只需返回 FileStreamResult

return File(stream, "text/plain", "foo.txt");

【讨论】:

【参考方案2】:

在下面的代码中,您使用 Response.OutputStream。但这在 asp.net 中完全有效,但 Response.OutputStream 在 asp.net 核心中抛出错误。

using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8)) 
    writer.Write("This is the content");

所以,使用下面的代码在 asp.net core 中下载文件。

using (MemoryStream stream = new MemoryStream())

StreamWriter objstreamwriter = new StreamWriter(stream);
objstreamwriter.Write("This is the content");
objstreamwriter.Flush();
objstreamwriter.Close(); 
return File(stream.ToArray(), "text/plain", "file.txt");

【讨论】:

请提供上下文并解释您的代码解决问题的原因和方式。【参考方案3】:

A little different way 但它似乎是你要找的东西

编辑:在文件末尾固定尾随零

[HttpGet]
[Route("testfile")]
public ActionResult TestFile()

    MemoryStream memoryStream = new MemoryStream();
    TextWriter tw = new StreamWriter(memoryStream);

    tw.WriteLine("Hello World");
    tw.Flush();

    var length = memoryStream.Length;
    tw.Close();
    var toWrite = new byte[length];
    Array.Copy(memoryStream.GetBuffer(), 0, toWrite, 0, length);

    return File(toWrite, "text/plain", "file.txt");

旧答案(尾随零问题)

[HttpGet]
[Route("testfile")]
public ActionResult GetTestFile() 
    MemoryStream memoryStream = new MemoryStream();
    TextWriter tw = new StreamWriter(memoryStream);

    tw.WriteLine("Hello World");
    tw.Flush();
    tw.Close();

    return File(memoryStream.GetBuffer(), "text/plain", "file.txt");

【讨论】:

【参考方案4】:
public ActionResult Create(Information information)

   var byteArray = Encoding.ASCII.GetBytes(information.FirstName + "" + information.Surname + "" + information.DOB + "" + information.Email + " " + information.Tel);
   var stream = new MemoryStream(byteArray);

   return File(stream, "text/plain", "your_file_name.txt");

【讨论】:

以上是关于在 ASP.net Core MVC 2.1 中创建文本文件并下载而不保存在服务器上的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.1 MVC - 无法设置从 Web api 响应接收到的 cookie

详解Asp.Net Core 2.1+的视图缓存(响应缓存)

将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类

在 asp net core MVC 应用程序中创建和验证 JWT 令牌(没有客户端服务器方法)

从 ASP.NET MVC 迁移到 ASP.NET Core MVC

Asp Core MVC 2.1授权基于每个用户的策略?