C# 下载分块或流式处理的大型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

我想通过浏览器下载一个大的csv文件(100+mb),但超时了。生成csv文件非常耗时,因此我无法在内存中全部读取或先写入磁盘

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)