我正在尝试使用Controller.File方法将大型.csv文件作为操作结果返回,并且它要求我使用byte[]
或Stream。
使用GetBytes
方法时,我收到了OutOfMemoryException
。
有没有办法在不尝试同时将其全部放入内存的情况下执行此操作?
这是我现在正在使用的回报:
string csv = data.ToCsv();
return File(Encoding.UTF8.GetBytes(csv), "text/csv", "ClusterFMCacheExport.csv");
答案 0 :(得分:1)
你试过这个吗?
using(MemoryStream stream = new MemoryStream())
using(StreamWriter writer = new StreamWriter(stream))
{
writer.Write(s);
writer.Flush();
stream.Position = 0;
return File(stream, "text/csv", "ClusterFMCacheExport.csv");
}
如果您的数据确实 大,那可能无济于事。如果您生成非常大型csv文件,建议您重新编写ToCsv()
生成stream
而不是string
。
答案 1 :(得分:0)
有一段时间没有使用ASP.NET,但不应该像这样工作(假设文件已经在磁盘上):
FileStream fs = ... // stream over your csv file, however you get it
return File(fs, "application/csv", "file.csv");
答案 2 :(得分:0)
岂不:
Response.AddHeader("content-disposition", "attachment;filename=file.csv");
return Content(csv, "application/csv");
避免转换?尽管如此,它可能只会让OOME重新出现在其他地方。