You need to enable JavaScript to run this app. ASP.NET Core 5部署到AWS Lambda后Excel文件解析失败如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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-data
    • application/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 19:03:01