このアクションがあるとしましょう:
public List<string> Index(IFormFile file){
//extract list of strings from the file
return new List<string>();
}
ファイルをドライブに保存する多くの例を見つけましたが、代わりにこれをスキップして、テキストの行をIFormFileから直接メモリの配列に読み込む場合はどうでしょうか。
IFormFile
の抽象化には .OpenReadStream
メソッド。大量の望ましくない潜在的に大きな割り当てを防ぐには、一度に1行ずつ読み取り、読み取った各行からリストを作成する必要があります。さらに、このロジックを拡張メソッドにカプセル化できます。 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();