下面是我的blazor服务器端项目页面,用于将excel文件上载到服务器并使用CsvHelper处理该文件
@page "/contact/import"
@using System.Data
@using System.IO
@using Microsoft.AspNetCore.Hosting 
@inject IWebHostEnvironment Environment
<h1>Upload Data</h1>
<p>This component   uploads data from Excel.</p>
 
<InputFile OnChange="@LoadFiles"  />
<MudButton HtmlTag="label"
           Variant="Variant.Filled"
           Color="Color.Primary"
           StartIcon="@Icons.Filled.CloudUpload"
           for="fileInput">
    Upload Files
</MudButton>
  
@code {
  
    protected override async Task OnInitializedAsync()
    {
    }
    private async Task LoadFiles(InputFileChangeEventArgs e)
    {
        try
        {  
            //https://learn.microsoft.com/en-us/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server#upload-files-to-a-server
            long maxFileSize =  1024 * 1024 * 15; //15 MB            
            foreach (var file in e.GetMultipleFiles(1))
            {
                string rootpath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "FileUploads");
                var trustedFileNameForFileStorage = file.Name; //Path.GetRandomFileName();
                var path = Path.Combine(rootpath,
                        trustedFileNameForFileStorage);
                await using FileStream fs = new(path, FileMode.Create);
                await file.OpenReadStream(maxFileSize).CopyToAsync(fs);
            }
        }
        catch(Exception ex)
        {
            
        } 
    }
}此代码将将文件保存到FileUploads文件夹中。
我使用CSVHelper读取用户上传的excel文件的内容,但找不到从特定位置保存的文件的读取方法。
避免将传入的文件流直接读入内存。例如,不要将文件字节复制到MemoryStream或读取为字节数组。这些方法可能会导致性能和安全问题,特别是在Blazor Server中。相反,请考虑将文件字节复制到外部存储区,例如blob或磁盘上的文件。如果需要访问表示文件字节的流,请使用IBrowserFile.OpenReadStream。
这就是为什么我考虑先将文件保存到某个位置,然后从文件中读取的原因。
但是找不到将文件内容复制到流中的方法,然后CsvHelper可以使用该流将其转换为数据表,如csvHelper示例中所示
using (var reader = new StreamReader("path\\to\\file.csv")) // How can i read from the file which is just saved!
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
   
}还是真的有必要保存文件或任何可用于将excel的内容读取到csvHelper的安全方法?
找到了另一个有用的线程在流中使用CsvHelper,但看起来解决方案是使用其他插件
发布于 2022-01-17 22:14:44
我维护一个Excel数据读取器库,您可能会更幸运地使用该库:Sylvan.Data.Excel。它是开源的,麻省理工学院授权的,目标是netStandard2.0或2.1 (它支持所有.NET核心版本),没有其他依赖项。它可以与文件路径一起使用,也可以为其提供流。
它支持三种最广泛使用的Excel格式.xlsx、.xslb和.xls。它是用于.NET的速度最快、内存效率最高的Excel库 (在某些情况下有很大的差距)。API实现了DbDataReader,因此对于任何使用过ADO.NET API的人来说,它都应该是熟悉的。
using Sylvan.Data.Excel;
var reader = ExcelDataReader.Create("path/to/file.xlsx");
// alternately you can provide a stream and a file type
//var reader = ExcelDataReader.Create(stream, ExcelWorkbookType.ExcelXml);
do // iterate sheets
{ 
    var sheet = reader.WorksheetName;
    // iterate rows in the file
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            var value = reader.GetString(i);
        }
    }
} while (reader.NextResult());https://stackoverflow.com/questions/70745065
复制相似问题