ASP.NET CORE WEBAPI文件下载
2021-03-10 13:31
标签:兼容 查询 stream lang col 工程 car 请求 语句 最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1。考虑如下场景: 经过简单的调研,得到以下结论。 建立好ASP.NET CORE WEBAPI工程,把生成文件的代码独立出来一个函数。我这里需要是下载一个CSV格式的文件,因此生成一个CSV文件。 CSV的Content-Type是text/csv,如果下载别的文件,请自行查询MIME格式。 直接执行上面的代码,直接报错“无法读取已经关闭的流”。猜测是离开using语句块的时候,stream自动被关闭了。改动很简单,去掉using语句,不再报相同错误。 但是返回的文件长度一直是0,单步调试发现Writer执行完毕之后,stream返回的长度是0,内容实际上并没有写入,想起有一个Flush(),可以添加以确保数据写入。 单步显示stream长度有了,但是返回的长度还是0。继续单步调试发现Stream的Postion是停在文件结尾的,这个和直接开始读取文件完全不一样,文件读取一般是从开头开始的,于是直接设置Postion为0,问题解决。 下载能够成功了,但是文件名一直显示的是随机生成的,体验很差。设置一下FileDownloadName即可。 核心代码如下: 使用swagger调用,最后效果: 后来查了一些资料,总结了一下: https://darchuk.net/2019/05/31/asp-net-core-web-api-returning-a-filestream/ ASP.NET CORE WEBAPI文件下载 标签:兼容 查询 stream lang col 工程 car 请求 语句 原文地址:https://www.cnblogs.com/podolski/p/12682978.html
准备
对目标有了基础的了解,就可以开始动手实现了。实现
对于磁盘上的文件,可以使用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();
}
直接返回Stream对象给Controller处理,处理代码如下:var res = await info.GetAllQueryResult();
var actionresult = new FileStreamResult(res, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("text/csv"));
return actionresult;
调试
public async Task
[HttpPost("file")]
[ProducesResponseType(typeof(FileResult), Status200OK)]
public async Task
总结
参考资料: