如何在ASP.NET Core中上传超大文件

默认情况下,ASP.NET Core只允许您上载最大大小约为28 MB的文件。但是,有时您希望突破此限制,想要上传更大的文件到服务器。那这时你该怎么办呢?这正是本篇文章想要介绍的:在.NET Core中如何实现上传超大文件的功能。

假设你现在有如下一个上传超大文件的页面:

如何在ASP.NET Core中上传超大文件

如下是该页面的Razor代码:

<h1>Upload Large File</h1>
<h2>@ViewData["message"]</h2>
<form asp-controller="Home" 
      asp-action="Upload" 
      method="post" 
      enctype="multipart/form-data">

    <input type="file" name="file" />
    <br /><br />
    <button type="submit">Upload File</button>
</form>

注意form标签里的enctype属性:multipart/form-data 这句话的主要作用就是告诉浏览器这表单上传的是个文件。

Home控制器里的Upload方法代码如下:

public IActionResult Upload
(IFormFile file,[FromServices] IHostingEnvironment env)
{

    string fileName = $"{env.WebRootPath}\{file.FileName}";

    using (FileStream fs = System.IO.File.Create(fileName))
    {
        file.CopyTo(fs);
        fs.Flush();
    }

    ViewData["message"] = 
$"{file.Length} bytes uploaded successfully!";

    return View("Index");
}

这段代码就不详细说了,主要就是把文件上传到服务器的网站根目录。此时,如果我们上传一个大的文件,比如上传一个100M的文件,如果您使用的是IIS Express,则会收到以下错误消息:

如何在ASP.NET Core中上传超大文件

如果你是运行在Kestrel上,则会出现如下错误:

如何在ASP.NET Core中上传超大文件

在IIS上的解决方案

1.首先,在你的项目的web.config文件里添加如下一段代码:

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="209715200" />
    </requestFiltering>
  </security>
</system.webServer>

这段代码的关键:requestLimits maxAllowedContentLength="209715200" 。这句话的意思就是把允许上传的最大文件设置为200M。这个值,你们可以根据自己项目的需要实际设置。这里,我们先暂时设置成200M。这时,我们再跑一下项目,会发现404错误已经不见了,取而代之的是另一种错误:

如何在ASP.NET Core中上传超大文件

这段错误代码的意思是表单上传的文件长度超过了134217727KB,要解决这个问题,我们只有在Home控制器里的Upload方法前加入如下属性声明:[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]

[HttpPost]
[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
public IActionResult Upload(IFormFile file,
[FromServices] IHostingEnvironment env)
{
  ...
  ...
}

在这里我们把表单上传的最大文件长度设置为209715200(这里的单位是bit)也就200M。

这时,我们再试运行下程序,上传100M的文件,就没问题了,效果如下:

如何在ASP.NET Core中上传超大文件

2.在Kestrel中的解决方案

如果你的程序时运行在Kestrel上,你可以在应用程序级别(整个系统),或者是Action级别控制上传文件的大小。

你如果要在Action级别控制上传文件的大小,你需要设置两个属性[RequestSizeLimit] 和 [RequestFormLimits].

[RequestSizeLimit]属性设置请求的最大长度(以字节为单位),而[RequestFormLimits]设置多部分正文长度的最大长度。

具体代码如下:

[HttpPost]
[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
[RequestSizeLimit(209715200)]
public IActionResult Upload(IFormFile file,
[FromServices] IHostingEnvironment env)
{
  ...
  ...
}

如果您希望为整个应用程序设置这些限制,那么修改您需要修改program.cs和startup.cs。

打开program.cs并按如下所示设置Kestrel限制:

public static IWebHostBuilder CreateWebHostBuilder
(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            options.Limits.MaxRequestBodySize = 209715200;
        });

上面的代码是把最大的请求长度设置为200M。

现在,再在ConfigureServices方法中加入如下一段代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<FormOptions>(x =>
    {
        x.MultipartBodyLengthLimit = 209715200;
    });
}

好了,通过如上设置,你在Kestrel中也可以上传超过系统默认设置的文件了。

原文转自:http://www.dalbll.com/Group/Topic/ASP.NET/6088