AWS无服务器Excel下载

问题描述

我正在尝试使用下面部署在AWS中的Lambda功能代码(ASP .Net Core 3.1)下载Excel文件。但是我遇到了文件损坏的问题。

ReportController.cs:

[HttpGet]
public IActionResult Get()
{
   Workbook workbook = new Workbook();
   Worksheet worksheet = workbook.Worksheets[0];
   worksheet.Zoom = 80;
   Style titleheaderStyle = worksheet.Workbook.CreateStyle();
   titleheaderStyle.Font.Name = "Calibri";
   titleheaderStyle.Font.Size = 13;
   titleheaderStyle.Font.IsBold = true;
   titleheaderStyle.Font.IsItalic = true;
   titleheaderStyle.HorizontalAlignment = TextAlignmentType.Left;
   titleheaderStyle.VerticalAlignment = TextAlignmentType.Top;
   worksheet.Cells[0,0].PutValue("Report");
   MemoryStream ms = new MemoryStream();
   workbook.Save(ms,SaveFormat.Xlsx);
   byte[] b1 = ms.ToArray();
   ms.Flush();
   Response.Clear();
   Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   Response.Headers.Add("Content-disposition","attachment; filename=testfile1.xlsx");
   Response.Body.WriteAsync(b1);
   return Ok();
}

LambdaEntryPoint.cs:

protected override void Init(IWebHostBuilder builder)
{
   RegisterResponseContentEncodingForContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ResponseContentEncoding.Base64);
   builder.UseStartup<Startup>();
}

我们已在AWS API Gateway中将二进制媒体类型更新为“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”,并在GET集成响应中将“内容处理”设置为“转换为二进制(CONVERT_TO_BINARY)”,并更新了200状态方法响应。 “应用程序/vnd.openxmlformats-officedocument.spreadsheetml.sheet”内容类型。如何解决以上问题?

更新

[HttpGet]
public IActionResult Get()
{
   Workbook workbook = new Workbook();
   Worksheet worksheet = workbook.Worksheets[0];
   worksheet.Zoom = 80;
   Style titleheaderStyle = worksheet.Workbook.CreateStyle();
   titleheaderStyle.Font.Name = "Calibri";
   titleheaderStyle.Font.Size = 13;
   titleheaderStyle.Font.IsBold = true;
   titleheaderStyle.Font.IsItalic = true;
   titleheaderStyle.HorizontalAlignment = TextAlignmentType.Left;
   titleheaderStyle.VerticalAlignment = TextAlignmentType.Top;
   worksheet.Cells[0,SaveFormat.Xlsx);
   byte[] b1 = ms.ToArray();
   ms.Flush();
   return new FileContentResult(b1,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
   {
      FileDownloadName = "testfile1.xlsx"
   };
}

解决方法

在您的LambdaEntryPoint类中,尝试通过调用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet方法将内容类型RegisterResponseContentEncodingForContentEncoding注册为base64编码。