file-upload - 如何读取内存中的excel文件(不保存在磁盘中)并返回其内容 dotnet core
问题描述
我正在使用 dotnet 核心开发 webApi,该核心从 IFormFile 获取 excel 文件并读取其内容。我正在关注文章 https://levelup.gitconnected.com/reading-an-excel-file-using-an-asp-net- core-mvc-application-2693545577db正在做同样的事情,只是这里的文件存在于服务器上,而我的文件将由用户提供。
这是代码:
public IActionResult Test(IFormFile file)
{
List<UserModel> users = new List<UserModel>();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
using (var stream = System.IO.File.Open(file.FileName, FileMode.Open, FileAccess.Read))
{
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
while (reader.Read()) //Each row of the file
{
users.Add(new UserModel
{
Name = reader.GetValue(0).ToString(),
Email = reader.GetValue(1).ToString(),
Phone = reader.GetValue(2).ToString()
});
}
}
}
return Ok(users);
}
}
当 system.IO 尝试打开文件时,由于路径不存在,它找不到路径。如何获取文件路径(根据用户选择的文件而有所不同)?有没有其他方法可以使它成为可能。
PS:我不想先上传服务器上的文件,然后再阅读。
解决方案
您正在使用该file.FileName
属性,它指的是浏览器发送的文件名。很高兴知道,但还不是服务器上的真实文件。您必须使用CopyTo(Stream)
方法来访问数据:
public IActionResult Test(IFormFile file)
{
List<UserModel> users = new List<UserModel>();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
using (var stream = new MemoryStream())
{
file.CopyTo(stream);
stream.Position = 0;
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
while (reader.Read()) //Each row of the file
{
users.Add(new UserModel{Name = reader.GetValue(0).ToString(), Email = reader.GetValue(1).ToString(), Phone = reader.GetValue(2).ToString()});
}
}
}
return Ok(users);
}
推荐阅读
- android - 我可以随时在 Android 上使用应用内商品吗?
- cordova - 在 Cordova 中的 deviceready 事件之前更改状态栏颜色
- c - 从内核进程和系统守护进程中过滤用户进程
- macos - 在收听 KEXT 的 Vnode 范围时获取命令行参数
- java - 如何使用java验证电子邮件地址?
- javascript - 打字稿:来自超类构造函数的成员变量
- android - 通过添加以下行来应对本机应用程序崩溃:应用插件:'com.google.gms.google-services'
- html - 自动换行时的事件
- java - 从树形图中删除元素
- android - 在 Activity.onDestroy() 方法之后,为什么我仍然可以得到这个活动的实例?