ASP.NET MVC 5输出和下载文件进度的最佳方法

时间:2018-11-12 07:40:58

标签: c# asp.net-mvc-4 file-io export-to-csv

我必须创建一个允许用户单击浏览器中的按钮并请求服务器从数据库获取信息的功能。该客户端能够下载该信息之后,该信息将输出到一个.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,因此我担心Streambyte[]中文件的缓冲大小会导致服务器内存泄漏。

我将进度分为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返回到浏览器,并将浏览器请求返回到下载文件的路径。

在这种情况下,我的解决方案是否是实现的好方法?使用Streambytes是否会导致服务器内存泄漏?请为我解释。

0 个答案:

没有答案