ASP.NET MVC 5 лучший подход для вывода и загрузки файла прогресса - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно создать функцию, которая позволит пользователю нажимать кнопку в браузере и запрашивать у сервера информацию из базы данных. Информация будет выведена в файл .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 гигабайт, поэтому я беспокоюсь, что размер буфера файла в 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 причиной утечки памяти на сервере или нет? Пожалуйста, объясните мне.

...