默认情况下,ASP.NET Core只允许您上载最大大小约为28 MB的文件。但是,有时您希望突破此限制,想要上传更大的文件到服务器。那这时你该怎么办呢?这正是本篇文章想要介绍的:在.NET Core中如何实现上传超大文件的功能。
假设你现在有如下一个上传超大文件的页面:
如下是该页面的Razor代码:
<h1>Upload Large File</h1> @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