gpt4 book ai didi

c# - 如何在 Razor Pages 中动态生成文件以供下载

转载 作者:行者123 更新时间:2023-12-04 09:46:27 24 4
gpt4 key购买 nike

我想添加一个按钮来下载动态生成的 CSV 文件。

我想我需要使用 FileStreamResult(或者可能是 FileContentResult),但我一直无法找到说明如何执行此操作的示例。

我见过创建物理文件然后下载该文件的示例。但我理想的解决方案是直接写入响应流,这比创建文件或先在内存中构建字符串要高效得多。

有没有人见过在 Razor Pages(不是 MVC)中动态生成文件以供下载的示例?

最佳答案

这就是我想出的。

标记:

<a class="btn btn-success" asp-page-handler="DownloadCsv">
Download CSV
</a>

处理程序:

public IActionResult OnGetDownloadCsv()
{
using MemoryStream memoryStream = new MemoryStream();
using CsvWriter writer = new CsvWriter(memoryStream);

// Write to memoryStream using SoftCircuits.CsvParser

writer.Flush(); // This is important!

FileContentResult result = new FileContentResult(memoryStream.GetBuffer(), "text/csv")
{
FileDownloadName = "Filename.csv""
};
return result;
}

此代码有效,但我希望它能更有效地使用内存。照原样,它将整个文件内容写入内存,然后将该内存复制到结果中。因此,在将任何内容写入响应流之前,一个大文件将在内存中存在两次。我对 FileStreamResult 很好奇,但无法让它正常工作。

如果有人可以对此进行改进,我很乐意将您的答案标记为已接受。

更新:

所以我意识到我可以调整上面的代码以使用 FileStreamResult 通过用这个替换最后一个 block :

memoryStream.Seek(0, SeekOrigin.Begin);
FileStreamResult result = new FileStreamResult(memoryStream, "text/csv")
{
FileDownloadName = "Filename.csv"
};
return result;

除了调用 memoryStream.GetBuffer() 来复制所有字节之外,它的工作原理几乎相同,它只是传递内存流对象。这是一个改进,因为我没有不必要地复制字节。

然而,缺点是我必须删除我的两个 using 语句,否则我会得到一个异常:

ObjectDisposedException: Cannot access a closed Stream.

看起来这是在额外复制字节或不清理我的流和 CSV 编写器之间的权衡。

最后,我能够阻止 CSV 编写器在处理流时关闭流,并且由于 MemoryStream 没有非托管资源,因此将其保持打开状态应该没有什么坏处。

关于c# - 如何在 Razor Pages 中动态生成文件以供下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com