记web项目的一个大文件上传排查笔记

       一、能够解决 

        在开发一个web项目的时候遇到一个上传文件的问题,起初开发自测都是传的小文件没有报错和问题,上线到测试发现无法上传大型文件甚至100m文件都无法上传。后面发现:

        Kestrel 和 HttpSys 都有默认的请求正文大小限制,这是为了防止恶意用户发送大量数据来攻击服务器。这个限制通常在30M左右。

在 Web 项目中,Kestrel 和 HttpSys 都强制实施 30M (~28.6MiB) 的最大请求正文大小限制,
如果请求正文大小超过配置的最大请求正文大小限制,
则引发 Request body too large. The max request body size is xxxxx 异常,
状态码为 413 或 500。

        解决办法是设置

        在特定接口下的方法添加
 

[HttpPost]
[RequestSizeLimit(100_000_000)] // 通常设置为 [RequestSizeLimit(long.MaxValue)]
[RequestFormLimits(MultipartBodyLengthLimit = long.MaxValue)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
}

       二、

        然而,即使你在代码中设置了这些限制,本地运行没有问题,上线到测试环境后还是不能上传大文件,并报request entity too large 413错误;

        最后发现Linux服务器上的Nginx或Apache等反向代理服务器也可能有自己的请求正文大小限制。这些限制可能会覆盖你在代码中设置的限制。

        为了解决这个问题,你需要在你的反向代理服务器(比如Nginx或Apache)的配置中,设置更大的请求正文大小限制。例如,如果你使用Nginx,你可以在配置文件中添加以下设置:

http {
    # 其他配置...

    client_max_body_size 3000m;

    server {
        # 你的服务器配置...
    }

    server {
        # 你的服务器配置...
    }

    # 其他服务器配置...
}

        这样,Nginx就会允许最大100M的请求正文大小。

        另外,你也需要确保你的应用程序在Linux服务器上运行时,也使用了你在代码中设置的请求正文大小限制。你可以通过查看应用程序的日志,来确认应用程序是否使用了你在代码中设置的限制。

        另外在ASP.NET Core中,你可以在Startup.cs文件的ConfigureServices方法中添加services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = long.MaxValue);来设置最大请求正文大小限制。这样,你就可以处理大文件上传了。

以下是具体的代码:

public void ConfigureServices(IServiceCollection services)
{
    // 其他服务的配置...

    // 设置最大请求正文大小限制
    services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = long.MaxValue);
}

        这段代码会将MultipartBodyLengthLimit设置为long.MaxValue,这意味着请求正文的大小限制将被设置为无限制。

        最后重启项目,重启docker服务就解决了以上问题。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值