我必须创建一个允许用户单击浏览器中的按钮并请求服务器从数据库获取信息的功能。该客户端能够下载该信息之后,该信息将输出到一个.csv文件。
我打算使用System.Web.Mvc.Controller
的两种方法之一
protected internal virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)
或
protected internal virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);
但是输出文件的大小最大为4 GB,因此我担心Stream
或byte[]
中文件的缓冲大小会导致服务器内存泄漏。
我将进度分为2个步骤
第1步:输出考虑到内存泄漏的csv文件
public CsvOutputHelper(List<string> csvHeader)
{
this._csvHeader = csvHeader;
}
public void OutputFile(List<List<string>> data, string filePath)
{
// Create the new file and write the header text
File.WriteAllText(filePath, this._csvHeader.ConvertToCsvRecord());
// 'StringBuilder' for output file
var sb = new StringBuilder();
sb.AppendLine();
// Line counter
var lineCounterValue = 1;
for (var i = 0; i < data.Count; i++)
{
// Create line content of csv file and append it to buffer string
sb.AppendLine(data[i].ConvertToCsvRecord());
// Increase value of line counter
lineCounterValue++;
// If buffer string is reach to 100 lines or the loop go to the end of data list,
// output text to file and reset value of buffer string and value of line counter
if (lineCounterValue == MaxCountOfOutputLine || i == data.Count - 1)
{
// Output buffer string
File.AppendAllText(filePath, sb.ToString());
sb = new StringBuilder(); // Re-create a new instance of 'StringBuilder'
lineCounterValue = 1; // Reset line counter value to 1
}
}
}
第2步:将服务器(相对路径)中的输出filePath
返回到浏览器,并将浏览器请求返回到下载文件的路径。
在这种情况下,我的解决方案是否是实现的好方法?使用Stream
或bytes
是否会导致服务器内存泄漏?请为我解释。