AWS .NET Core Lambda - 图像上传已损坏



我正在使用 .NET Core 使用 AWS Lambda 构建 Web API。

我遇到了一个问题,下面的代码片段在我的 Windows 机器上按预期工作(回显图像),但在部署到 AWS Lambda 时,返回的图像被破坏了。经过进一步调查,回显文件的大小几乎是部署在 AWS 上的发送文件大小的两倍?

[HttpPost]
public async Task<IActionResult> Post(IFormFile file)
{
using (var tmpStream = new MemoryStream())
{
await file.CopyToAsync(tmpStream);
var fileExtension = Path.GetExtension(file.FileName);
return File(tmpStream.ToArray(), file.ContentType);
}
}

我是否缺少某些配置或忽略了某些内容?AWS 网关??

(我正在通过邮递员测试问题)

你看过文件的内容吗?我猜这是 html 错误结果或其他什么。

在这篇博文(无服务器 ASP.NET 核心 2.0 应用程序)中,他们提到:

如果您的 Web 应用程序显示图像,我们建议您从 Amazon S3 提供这些图像。这对于返回静态内容(如图像、级联样式表等)更有效。此外,要将图像从 Lambda 函数返回到浏览器,您需要在 API 网关中对二进制数据进行额外配置。

有关如何配置二进制数据的 API 网关。

如果有人正在寻找解决方案,除了在 API 网关设置中添加"多部分/表单数据"作为二进制媒体类型外,还需要在资源的方法请求正文中添加模型。

详情请见 https://github.com/aws/aws-lambda-dotnet/issues/635#issuecomment-616226910

步骤:

  • 在 LambdaEntryPoint.cs 文件中将"multipart/form-data"添加为二进制类型(如果它是这样命名的)。
public class LambdaEntryPoint : APIGatewayProxyFunction
{
/// <summary>
/// The builder has configuration, logging and Amazon API Gateway already configured. The startup class
/// needs to be configured in this method using the UseStartup<>() method.
/// </summary>
/// <param name="builder"></param>
protected override void Init(IWebHostBuilder builder)
{
RegisterResponseContentEncodingForContentType("multipart/form-data", ResponseContentEncoding.Base64);
builder.UseStartup<Startup>();
}
}
  • 在 AWS API 网关的设置部分添加二进制媒体类型,如下所示 这里 - API 网关中的二进制媒体类型。
  • 为 API 网关创建新模型,其配置为
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "MediaFileUpload",
"type": "object",
"properties": {
"file": { "type": "string" }
}
}
  • 通过使用创建的模型作为"多部分/表单数据"内容类型(如 API 网关资源中所示),在"请求正文"中添加条目来更新方法请求步骤。
  • 请确保部署 API,以便更改生效。

编辑:添加了代码,以及为清楚起见的其他步骤,如@JeremyCaney的评论

在 AWS API Gateway 的设置部分添加 BinaryMediaType "multipart/form-data"。部署 API(如果之前执行过,请在更改设置后再次执行此操作)。

最新更新