如何在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM