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