ASP.NET CORE WEBAPI文件下载

简介:

ASP.NET CORE WEBAPI文件下载

最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1。考虑如下场景:

文件是程序生成的。
文件应该能兼容各种格式。
浏览器可以感知进行下载。
准备
经过简单的调研,得到以下结论。

ASP.NET CORE 提供FileResult这种类型的ActionResult,可以直接返回文件结果,不需要直接处理HttpResponse。
通过Stream可以直接返回文件流供浏览器下载。
FileStreamResult是FileResult的具体实现,返回值应该是此类对象。
Stream有多种类型,适合直接内存中生成文件对象的是MemoryStream。
对目标有了基础的了解,就可以开始动手实现了。
实现
建立好ASP.NET CORE WEBAPI工程,把生成文件的代码独立出来一个函数。我这里需要是下载一个CSV格式的文件,因此生成一个CSV文件。
对于磁盘上的文件,可以使用FileStream对象,由于我这里需要运行中生成这个文件,需要使用MemoryStream。

using var stream = new MemoryStream();
using var writer = new StreamWriter(stream);
//生成标题
var propCollection = ttype.GetProperties();
foreach (var n in propCollection)
{

writer.Write(n.Name);
writer.Write(",");

}
writer.WriteLine();
//生成内容
foreach (var item in res)
{

foreach (var n in propCollection)
{
    writer.Write(Convert.ToString(n.GetValue(item)));
    writer.Write(",");
}
writer.WriteLine();

}
请不要考虑里面反射的相关内容,按照自己的逻辑生成CSV即可,我只是懒得改代码而已。
代码中使用到了一些新的语法特性,请注意对低版本的.NET不一定适用。
直接返回Stream对象给Controller处理,处理代码如下:
var res = await info.GetAllQueryResult();
var actionresult = new FileStreamResult(res, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("text/csv"));
return actionresult;
CSV的Content-Type是text/csv,如果下载别的文件,请自行查询MIME格式。

调试
直接执行上面的代码,直接报错“无法读取已经关闭的流”。猜测是离开using语句块的时候,stream自动被关闭了。改动很简单,去掉using语句,不再报相同错误。

但是返回的文件长度一直是0,单步调试发现Writer执行完毕之后,stream返回的长度是0,内容实际上并没有写入,想起有一个Flush(),可以添加以确保数据写入。

单步显示stream长度有了,但是返回的长度还是0。继续单步调试发现Stream的Postion是停在文件结尾的,这个和直接开始读取文件完全不一样,文件读取一般是从开头开始的,于是直接设置Postion为0,问题解决。

下载能够成功了,但是文件名一直显示的是随机生成的,体验很差。设置一下FileDownloadName即可。

核心代码如下:

public async Task GetAllQueryResult()
{

var stream = new MemoryStream();
var writer = new StreamWriter(stream);
//生成标题
var propCollection = ttype.GetProperties();
foreach (var n in propCollection)
{
    writer.Write(n.Name);
    writer.Write(",");
}
writer.WriteLine();
//生成内容
foreach (var item in res)
{
    foreach (var n in propCollection)
    {
        writer.Write(Convert.ToString(n.GetValue(item)));
        writer.Write(",");
    }
    writer.WriteLine();
}
writer.Flush();
stream.Position = 0;
return stream;

}
[HttpPost("file")]
[ProducesResponseType(typeof(FileResult), Status200OK)]
public async Task Download()
{

var info = new Info();
var res = await info.GetAllQueryResult();

var actionresult = new FileStreamResult(res, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("text/csv"));
actionresult.FileDownloadName = "Carinfos.csv";
//Response.ContentLength = res.Length;
return actionresult;

}
使用swagger调用,最后效果:

总结
后来查了一些资料,总结了一下:

MemoryStream如果使用using语句,会在离开代码块的时候自动关闭,实际上ASP.NET CORE会自动处理关闭的事项,不需要使用using语句。
由于生成文件的过程是从文件流的开头一直进行到末尾的,因此向请求端返回结果时,应当重置Stream的游标,从0开始传输。
记得在使用writer之后使用Flush()以确保数据有写入。
如果不确定文件格式,可以直接返回MIME值为application/oct-stream。
设置FileStreamResult的FileDownloadName属性可以修改文件的默认名称。
(可选)可以通过设置Response.ContentLength来设置文件的长度。
参考资料:
https://darchuk.net/2019/05/31/asp-net-core-web-api-returning-a-filestream/

原文地址https://www.cnblogs.com/podolski/p/12682978.html

相关文章
|
10天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
67 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
40 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
60 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
32 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报
|
前端开发 .NET Linux
|
前端开发 .NET Linux
【翻译】Asp.net Core介绍
ASP.NET Core is a significant redesign of ASP.NET. This topic introduces the new concepts in ASP.NET Core and explains how they help you develop modern web apps. Asp.net Core是重新设计过得新一代Asp.Net。
1154 0