如何从ASP.NET Core中的IFormFile读入内存中的文本行的行?

时间:2016-10-14 14:04:15

标签: parsing file-upload asp.net-core

说你有这个动作:

public List<string> Index(IFormFile file){

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

我发现了很多将文件保存到驱动器的示例,但是如果我想跳过这个并且只是直接从IFormFile读取文本行到内存中的数据会怎样?

2 个答案:

答案 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();
    }
}