zoukankan      html  css  js  c++  java
  • 如何在ASP.NET Core中上传超大文件

    默认情况下,ASP.NET Core只允许您上载最大大小约为28 MB的文件。但是,有时您希望突破此限制,想要上传更大的文件到服务器。那这时你该怎么办呢?这正是本篇文章想要介绍的:在.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,则会收到以下错误消息:

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

    在IIS上的解决方案

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

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

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

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

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

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

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

    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

    螃蟹在剥我的壳,笔记本在写我。 漫天的我落在枫叶雪花上。 而你在想我。
  • 相关阅读:
    table首行固定
    JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期
    Struts2二级菜单联动
    Servlet和Struts2同时使用
    最近的感想
    java.lang.NoClassDefFoundError: javax/el/ELResolver 问题解决
    Event Loop、函数式编程、IO多路复用、事件驱动、响应式、
    Git 的使用(一)
    Linux 硬链接与软链接 目录结构
    并发、并行、同步、异步相关感念
  • 原文地址:https://www.cnblogs.com/skytitan/p/11325137.html
Copyright © 2011-2022 走看看