Как читать в памяти строки текстового файла из IFormFile в ASP.NET Core?

Скажем, у вас есть это действие:

public List<string> Index(IFormFile file){

    //extract list of strings from the file
    return new List<string>();
}

Я нашел множество примеров сохранения файла на диск, но что если я вместо этого захочу пропустить это и просто прочитать строки текста в массив в памяти, прямо из IFormFile?

Ответ 1

Абстракция для IFormFile имеет метод .OpenReadStream. Чтобы предотвратить массу нежелательных и потенциально больших выделений, мы должны читать по одной строке за раз и составлять наш список из каждой строки, которую мы читаем. Кроме того, мы могли бы заключить эту логику в метод расширения. Действие Index выглядит примерно так:

public List<string> Index(IFormFile file) => file.ReadAsList();

Соответствующий метод расширения выглядит следующим образом:

public static List<string> ReadAsList(this IFormFile file)
{
    var result = new StringBuilder();
    using (var reader = new StreamReader(file.OpenReadStream()))
    {
        while (reader.Peek() >= 0)
            result.AppendLine(reader.ReadLine()); 
    }
    return result;
}

Также у вас может быть и версия async:

public static async Task<string> ReadAsStringAsync(this IFormFile file)
{
    var result = new StringBuilder();
    using (var reader = new StreamReader(file.OpenReadStream()))
    {
        while (reader.Peek() >= 0)
            result.AppendLine(await reader.ReadLineAsync()); 
    }
    return result.ToString();
}

Тогда вы можете использовать эту версию следующим образом:

public Task<List<string>> Index(IFormFile file) => file.ReadAsListAsync();