开发工具:vs2022企业版
框架:abp vnext 3.1
操作系统:windows11
MinIO上传功能已经实现了,请参考这篇文章:MinIO (二) .net core中实现上传下载
通过反编译MinIO上传方法,如果上传的文件超过5M,会自动进行分片上传,上传速度还是可以的。
但是有个问题,net限制了上传的大小,只能上传25M上下的文件,如果上传一个八十多兆的文件,swagger接口报错,如果前端调用上传接口,会报CORS跨域错误,这篇文章介绍怎么解决这个问题。
1、Request body too large 错误
Post的body大概超过30m就会报这个错误,完整的错误是Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large
解决方法:全局增加请求body的大小,在Program.cs文件中增加配置:
options.Limits.MaxRequestBodySize = 1024 * 1024 * 500;//500MB
internal static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
//设置请求体大小
webBuilder.ConfigureKestrel((context, options) =>
{
options.Limits.MaxRequestBodySize = 1024 * 1024 * 500;//500MB
});
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
}
2、Multipart body length limit 134217728 exceeded 错误
Post的body大概超过100多M会碰到这个错误,完整的错误信息是 System.IO.InvalidDataException: Multipart body length limit 134217728 exceeded. 。
解决的方法是在startup.cs添加代码:
public void ConfigureServices(IServiceCollection services)
{
var configuration = services.GetConfiguration();
var appSettings = configuration.GetSection("AppSettings").Get<AppSettings>();
services.AddApplication<MesHttpApiHostModule>(options =>
{
options.Services.AddObjectAccessor(appSettings);
});
//设置表单的最大值
services.Configure<FormOptions>(x =>
{
//x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = 1024 * 1024 * 500;//500MB
});
}
到这里,设置完成后,通过swagger调用接口上传两百多兆的文件是没问题的,但是通过前端调接口上传依然报CORS跨域错误,我们的项目用的是IIS,所以还要设置IIS对文件的限制,有两步。
把“最大请求实体主体限制”200000改大,这里限制了最大上传是200K,可以在后面加3个0,200000000则限制大小变为约200M
这里设完后,还有一个地方需要在设一下,回到点击站点,双击“请求筛选”,如下图
进去后点击右边的编辑功能设置,下图
这里的300000000是限制上传约30M,适当的改大,后面加一个0就是限制约300M。
至此,通过前端调用上传接口,上传256M的文件30s成功。