.NET Framework中替代IFormFile与CopyToAsync实现Excel读取的问题
.NET Framework替代.NET Core的IFormFile文件上传及EPPlus适配方案
1. 替换IFormFile实现文件接收
在.NET Framework的ASP.NET MVC项目中,用HttpPostedFileBase替代.NET Core里的IFormFile接收上传文件即可。只需将控制器方法的参数类型改成HttpPostedFileBase,视图无需调整(表单的name="file"与参数名匹配,完全兼容)。
2. 替换await file.CopyToAsync(stream)代码
HttpPostedFileBase通过InputStream属性直接提供文件流,可按两种方式适配原有逻辑:
- 同步复制:用
Stream.CopyTo完成流复制 - 异步复制:用
Stream.CopyToAsync,注意控制器方法需改为异步并返回Task
修改后的核心代码
// 异步版本(保留原异步逻辑) public async Task ExcelProducts(HttpPostedFileBase file) { using (var stream = new MemoryStream()) { // 调用InputStream的异步复制方法 await file.InputStream.CopyToAsync(stream); stream.Position = 0; // 重置流指针到起始位置 using (var package = new ExcelPackage(stream)) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; var rowcount = worksheet.Dimension.Rows; for (int row = 2; row <= rowcount; row++) { try { // 原有业务逻辑无需修改 } catch { // 原有异常处理逻辑无需修改 } } } } } // 同步版本(不需要异步场景) public void ExcelProducts(HttpPostedFileBase file) { using (var stream = new MemoryStream()) { // 调用同步复制方法 file.InputStream.CopyTo(stream); stream.Position = 0; // 重置流指针到起始位置 using (var package = new ExcelPackage(stream)) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; var rowcount = worksheet.Dimension.Rows; for (int row = 2; row <= rowcount; row++) { try { // 原有业务逻辑无需修改 } catch { // 原有异常处理逻辑无需修改 } } } } }
视图代码保持不变
原表单配置完全适配.NET Framework环境,无需调整:
<div class="text-center"> <div class="container"> <form method="post" action="Market/ExcelProducts" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">Submit</button> </form> </div> </div>
内容的提问来源于stack exchange,提问作者Mert Çakar
相关产品推荐
相关产品推荐

