说你有这个动作:
public List<string> Index(IFormFile file){
//extract list of strings from the file
return new List<string>();
}
我发现了很多将文件保存到驱动器的示例,但是如果我想跳过这个并且只是直接从IFormFile读取文本行到内存中的数据会怎样?
答案 0 :(得分:28)
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();
答案 1 :(得分:7)
ASP.NET Core 3.0-将表单文件的内容读取为字符串
public static async Task<string> ReadFormFileAsync(IFormFile file)
{
if (file == null || file.Length == 0)
{
return await Task.FromResult((string)null);
}
using (var reader = new StreamReader(file.OpenReadStream()))
{
return await reader.ReadToEndAsync();
}
}