C# 下载分块或流式处理的大型csv文件(字符串)
我想通过浏览器下载一个大的csv文件(100+mb),但超时了。生成csv文件非常耗时,因此我无法在内存中全部读取或先写入磁盘C# 下载分块或流式处理的大型csv文件(字符串),c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我想通过浏览器下载一个大的csv文件(100+mb),但超时了。生成csv文件非常耗时,因此我无法在内存中全部读取或先写入磁盘 public IActionResult Download1() { var bytes = FetchBytes(); return File(bytes, "text/csv", "download1.csv"); } FileStreamResult需要提取内存中的所有流 // GET or POST public IActionResult D
public IActionResult Download1()
{
var bytes = FetchBytes();
return File(bytes, "text/csv", "download1.csv");
}
FileStreamResult
需要提取内存中的所有流
// GET or POST
public IActionResult Download()
{
var stream = FetchStream();
return new FileStreamResult(stream, "text/csv");
}
我尝试编写块来响应,我可以在浏览器中看到文件下载进度,但我没有获得文件下载或文件下载对话框
// GET or POST
public ActionResult Download()
{
var response = this.Response;
var size = 4096;
foreach (var csvBatch in csvBatches)
{
byte[] bytes = Encoding.ASCII.GetBytes(csvBatch);
using (var ms = new MemoryStream(bytes))
{
var data = new byte[size];
var bytesRead = 0;
do
{
bytesRead = ms.Read(data, 0, size);
response.Body.Write(data, 0, readBytes);
response.Body.Flush();
} while (bytesRead > 0);
}
}
response.ContentType = "text/csv";
response.Headers.Add("Content-Disposition", $"attachment;filename=\"{fileName}\"");
// this streams the file but does not download or give file download dialog
}
Net Core没有可重写FileResult
的WriteFile(HttpResponseBase)
方法,根据该方法可以写入Response.OutputStream
我怎样才能做到这一点?有很多方法可以做到这一点,也有很多有用的类可供使用。不要打断你的头,因为它们在默认情况下是不会碎块的 我推荐的是课堂。它接受构造函数上的缓冲区大小 下面是它的工作原理示例
public async Task<HttpResponseMessage> Download()
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
var stream = await GetStreamFromSomewhereMethod();
var content = new StreamContent(stream, 4096); //buffer is 4KB
response.Content = content;
return response;
}
公共异步任务下载()
{
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
var stream=等待GetStreamFromSomewhereMethod();
var content=newstreamcontent(stream,4096);//缓冲区为4KB
响应。内容=内容;
返回响应;
}
希望有帮助。在流媒体示例中设置响应
ContentType
是否允许显示下载对话框?这可能值得一看:FileStreamResult
不应单独将整个流拉入内存。如果发生这种情况,很可能是由于FetchStream
所做的任何事情造成的。@CalC,它没有。更新的问题。@chris pratt:你有一个FileStreamResult的例子吗?csvBatches代码不会更改,而是返回一个流。Request.CreateResponse(HttpStatusCode.OK)
表示请求没有CreateResponse的定义。使用(netcore 2.0)。改为使用var resp=new-HttpResponseMessage(HttpStatusCode.OK)