目前,我正在使用Asp.Net Core和MVC6需要上传文件大小无限制。我已经搜索了它的解决方案,但仍未得到实际答案。
如果有任何人有任何想法,请帮助。
感谢。
答案 0 :(得分:53)
其他答案解决了IIS限制。但是,从 ASP.NET Core 2.0开始,Kestrel服务器也强加了自己的默认限制。
Github of KestrelServerLimits.cs
Announcement of request body size limit and solution (quoted below)
如果要更改特定MVC操作或控制器的最大请求主体大小限制,可以使用RequestSizeLimit
属性。以下内容允许MyAction
接受最多100,000,000字节的请求主体。
[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
[DisableRequestSizeLimit]
可用于使请求大小无限制。这有效地恢复了归属操作或控制器的2.0.0之前的行为。
如果请求未由MVC操作处理,则仍可使用IHttpMaxRequestBodySizeFeature
按请求修改限制。例如:
app.Run(async context =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 100_000_000;
MaxRequestBodySize
是一个可以长篇大论。将其设置为null会禁用MVC&#39; s [DisableRequestSizeLimit]
等限制。
如果应用尚未开始阅读,您只能配置请求的限制;否则抛出异常。有IsReadOnly
属性可以告诉您MaxRequestBodySize
属性是否处于只读状态,这意味着配置限制为时已晚。
如果要全局修改最大请求正文大小,可以通过修改MaxRequestBodySize
或UseKestrel
回调中的UseHttpSys
属性来完成此操作。在这两种情况下,MaxRequestBodySize
都是可以为空的。例如:
.UseKestrel(options =>
{
options.Limits.MaxRequestBodySize = null;
或
.UseHttpSys(options =>
{
options.MaxRequestBodySize = 100_000_000;
答案 1 :(得分:32)
当您上传任何超过30MB的文件时,您可能会获得404.13 HTTP状态代码。如果您在IIS中运行ASP.Net Core应用程序,则IIS管道会在您的请求到达您的应用程序之前拦截您的请求。
更新您的web.config:
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
<!-- Add this section for file size... -->
<security>
<requestFiltering>
<!-- Measured in Bytes -->
<requestLimits maxAllowedContentLength="1073741824" /> <!-- 1 GB-->
</requestFiltering>
</security>
</system.webServer>
之前的ASP.Net应用程序也需要这一部分,但在Core中不再需要它,因为您的请求由中间件处理:
<system.web>
<!-- Measured in kilobytes -->
<httpRuntime maxRequestLength="1048576" />
</system.web>
答案 2 :(得分:19)
在Visual Studio 2017创建的ASP.NET Core 1.1项目中,如果要增加上载文件大小。您需要自己创建web.config文件,并添加以下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<!-- 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
在Startup.cs文件中,添加以下内容:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue;
x.MultipartHeadersLengthLimit = int.MaxValue;
});
services.AddMvc();
}
答案 3 :(得分:11)
您需要执行以下三个步骤:
默认请求限制(maxAllowedContentLength)为 30,000,000字节,大约为 28.6MB 。在web.config文件中自定义限制:
<system.webServer>
<security>
<requestFiltering>
<!-- Handle requests up to 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
注意:如果没有在IIS上运行此应用程序,将无法正常工作。
services.Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = int.MaxValue;
});
services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB
});
services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MultipartBodyLengthLimit = int.MaxValue; // if don't set default value is: 128 MB
options.MultipartHeadersLengthLimit = int.MaxValue;
});
添加以上所有选项将解决与文件大小超过30.0 MB的文件上传有关的问题。
答案 4 :(得分:2)
为了完整起见,我将为其他像我这样不幸的小伙子添加Source
在Startup.cs
中:
services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = 60000000;
});
答案 5 :(得分:2)
就我而言,我需要增加文件上传大小限制,但仅限于单个页面。
文件上传大小限制是一项安全功能,关闭它或全局增加它通常不是一个好主意。您不希望某些脚本小子通过上传超大文件来对您的登录页面进行 DOS 操作。此文件上传限制为您提供了一些保护,因此关闭它或全局增加它并不总是一个好主意。
因此,要增加单个页面而不是全局的限制:
(我使用的是 ASP.NET MVC Core 3.1 和 IIS,Linux 配置会有所不同)
1.添加 web.config
否则 IIS(或 IIS Express,如果在 Visual Studio 中进行调试)将在请求到达您的代码之前阻止它并显示“HTTP 错误 413.1 - 请求实体太大”。
注意“location”标签,它将上传限制限制为特定页面
您还需要“handlers”标签,否则浏览到该路径时会出现 HTTP 404 错误
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="SomeController/Upload">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<security>
<requestFiltering>
<!--unit is bytes => 500 Mb-->
<requestLimits maxAllowedContentLength="524288000" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
接下来您需要将 RequestSizeLimit 属性添加到您的控制器操作中,因为 Kestrel 也有自己的限制。 (如果您愿意,您可以通过中间件根据其他答案进行操作)
[HttpPost]
[RequestSizeLimit(500 * 1024 * 1024)] //unit is bytes => 500Mb
public IActionResult Upload(SomeViewModel model)
{
//blah blah
}
为了完整性(如果使用 MVC),您的视图和视图模型可能如下所示:
查看
<form method="post" enctype="multipart/form-data" asp-controller="SomeController" asp-action="Upload">
<input type="file" name="@Model.File" />
</form>
查看模型
public class SomeViewModel
{
public IFormFile File { get; set; }
}
并且,如果您通过表单发布上传大于 128Mb 的文件,您也可能会遇到此错误
<块引用>InvalidDataException:超出多部分正文长度限制 134217728。
因此,您可以在控制器操作上添加 RequestFormLimits 属性
[HttpPost]
[RequestSizeLimit(500 * 1024 * 1024)] //unit is bytes => 500Mb
[RequestFormLimits(MultipartBodyLengthLimit = 500 * 1024 * 1024)]
public IActionResult Upload(SomeViewModel model)
{
//blah blah
}
答案 6 :(得分:1)
在您的web.config中:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
</system.webServer>
手动编辑ApplicationHost.config文件:
ApplicationHost.config
文件中,找到<requestLimits>
节点。删除maxAllowedContentLength
属性。或者,添加一个与客户端作为请求的一部分发送的Content-Length标头的大小匹配的值。默认情况下,maxAllowedContentLength
属性的值为30000000。
保存ApplicationHost.config
文件。
答案 7 :(得分:1)
使用web.config可能会损害.NET核心的体系结构,并且在Linux或Mac上部署解决方案时可能会遇到问题。
最好使用Startup.cs来配置此设置:例如:
services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart
});
这是一个更正:
您还需要添加web.config,因为当请求到达IIS时,它将搜索web.config并检查maxupload长度:sample:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<!-- 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
答案 8 :(得分:0)
在您的startup.cs
中配置FormsOptions
Http功能:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FormOptions>(o => // currently all set to max, configure it to your needs!
{
o.ValueLengthLimit = int.MaxValue;
o.MultipartBodyLengthLimit = long.MaxValue; // <-- !!! long.MaxValue
o.MultipartBoundaryLengthLimit = int.MaxValue;
o.MultipartHeadersCountLimit = int.MaxValue;
o.MultipartHeadersLengthLimit = int.MaxValue;
});
使用IHttpMaxRequestBodySizeFeature
Http功能来配置MaxRequestBodySize
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = null; // unlimited I guess
await next.Invoke();
});
}
茶est :
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>.UseKestrel(o => o.Limits.MaxRequestBodySize = null);
});
IIS -> web.config :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<!-- ~ 2GB -->
<httpRuntime maxRequestLength="2147483647" /> // kbytes
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- ~ 4GB -->
<requestLimits maxAllowedContentLength="4294967295" /> // bytes
</requestFiltering>
</security>
</system.webServer>
</configuration>
Http.sys :
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>().UseHttpSys(options =>
{
options.MaxRequestBodySize = null;
});
});
MemoryStream
中,则会收到错误消息Stream was too long
,因为{{ 1}}是MemoryStream
。
您将必须实现自己的自定义int.MaxValue
类。
但是无论如何,缓冲这么大的文件是没有意义的。