如何在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中也可以上传超过系统默认设置的文件了。