增加Asp.Net核心中的上传文件大小

时间:2016-08-01 12:01:01

标签: asp.net-core asp.net-core-mvc

目前,我正在使用Asp.Net Core和MVC6需要上传文件大小无限制。我已经搜索了它的解决方案,但仍未得到实际答案。

I have tried this link

如果有任何人有任何想法,请帮助。

感谢。

9 个答案:

答案 0 :(得分:53)

其他答案解决了IIS限制。但是,从 ASP.NET Core 2.0开始,Kestrel服务器也强加了自己的默认限制。

Github of KestrelServerLimits.cs

Announcement of request body size limit and solution (quoted below)

MVC说明

如果要更改特定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属性是否处于只读状态,这意味着配置限制为时已晚。

全局配置说明

如果要全局修改最大请求正文大小,可以通过修改MaxRequestBodySizeUseKestrel回调中的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)

可能是我来晚了,但这是在ASP.NET Core版本> = 2.0中上传大小超过30.0 MB的文件的完整解决方案:

您需要执行以下三个步骤:

1。 IIS内容长度限制

默认请求限制(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上运行此应用程序,将无法正常工作。

2。 ASP.NET核心请求长度限制:

对于在IIS上运行的应用程序:

services.Configure<IISServerOptions>(options =>
{
    options.MaxRequestBodySize = int.MaxValue;
});

对于在Kestrel上运行的应用程序:

services.Configure<KestrelServerOptions>(options =>
{
    options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB
});

3。表单的MultipartBodyLengthLimit

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>
  1. 接下来您需要将 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)

  1. 在您的web.config中:

    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="2147483648" />
        </requestFiltering>
      </security>
    </system.webServer>
    
  2. 手动编辑ApplicationHost.config文件:

    1. 单击开始。在开始搜索框中,键入记事本。右键单击“记事本”,然后单击“以管理员身份运行”。
    2. 在“文件”菜单上,单击“打开”。在“文件名”框中,键入“%windir%\ system32 \ inetsrv \ config \ applicationhost.config”,然后单击“打开”。
    3. ApplicationHost.config文件中,找到<requestLimits>节点。
    4. 删除maxAllowedContentLength属性。或者,添加一个与客户端作为请求的一部分发送的Content-Length标头的大小匹配的值。默认情况下,maxAllowedContentLength属性的值为30000000。

      enter image description here

    5. 保存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;
            });
        });


如果您要上传非常大的文件(可能有几GB大小),并且想要将其缓冲到服务器上的MemoryStream中,则会收到错误消息Stream was too long,因为{{ 1}}是MemoryStream

您将必须实现自己的自定义int.MaxValue类。 但是无论如何,缓冲这么大的文件是没有意义的。