ASP.NET Core 5部署到AWS Lambda后Excel文件解析失败如何解决
问题根因
所有Excel解析库均报文件损坏错误,核心原因是AWS API Gateway默认未正确处理二进制格式的multipart/form-data请求,导致上传的Excel文件流被转码篡改,其次可能是请求流不可寻址、表单大小限制不匹配的问题。
解决方案
1. 配置API Gateway二进制媒体类型
进入AWS API Gateway控制台,找到绑定当前Lambda函数的API,执行以下操作:
- 点击左侧菜单「设置」,找到「二进制媒体类型」配置项
- 新增两个媒体类型:
multipart/form-dataapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- 保存配置后,点击右上角「操作」->「部署API」,选择你对应的部署阶段,确认部署生效。
2. 调整ASP.NET Core配置
2.1 放开表单大小限制
在Startup.cs的ConfigureServices方法中添加表单配置,根据你上传的Excel大小调整上限:
services.Configure<FormOptions>(options => { // 单文件最大10MB,可按需调整 options.MultipartBodyLengthLimit = 10 * 1024 * 1024; });
2.2 适配Lambda运行时的二进制请求
找到项目自动生成的LambdaEntryPoint.cs文件,在Init方法中启用多部分表单数据支持:
protected override void Init(IWebHostBuilder builder) { builder .UseStartup<Startup>() // 新增这行配置 .ConfigureAppConfiguration((context, config) => { context.Configuration["Lambda:EnableMultiPartFormData"] = "true"; }); }
3. 调整文件流处理逻辑
Lambda环境下接收到的请求流默认是仅前向、不支持Seek操作的,而绝大多数Excel解析库要求流可寻址,因此需要先将上传的流复制到内存流后再进行解析,示例如下(以NPOI为例,其他库同理):
[HttpPost] public async Task<IActionResult> UploadExcelNPOI(IFormFile file) { try { var receivedContent = ""; if (file.Length > 0) { var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); // 先复制到可寻址的内存流 using var fileStream = file.OpenReadStream(); using var ms = new MemoryStream(); await fileStream.CopyToAsync(ms); ms.Seek(0, SeekOrigin.Begin); // 用内存流解析Excel var xssWorkbook = new XSSFWorkbook(ms); var sheet = xssWorkbook.GetSheetAt(0); var row = sheet.GetRow(0); var cell = row.GetCell(0); receivedContent = cell.StringCellValue; return Ok(new { receivedContent }); } else { return BadRequest(); } } catch (Exception ex) { return StatusCode(500, $"Internal server error: {ex}"); } }
可选:调整Lambda函数配置
如果上传的Excel较大,可以在Lambda控制台将函数内存调整为1024MB、超时时间调整为30秒,避免资源不足导致流截断。
关于Dockerfile
你当前使用的官方默认Dockerfile无需修改,不影响文件解析逻辑。
内容的提问来源于stack exchange,提问作者Jacek Kowalski
相关产品推荐
相关产品推荐

