2021年1月14日 星期四

.Net Core 問題7 HTTP ERROR 413.1 - Request Entity Too Large

目前在寫一個.net core上傳
ok這都很簡單網路上一堆code
Html
<form enctype="multipart/form-data" method="post" asp-controller="FileStream" asp-action="Upload">
    多選檔案:<input type="file" name="File" multiple  />    <input type="submit" value="上傳" />
</form>
Controller
private IWebHostEnvironment _hostingEnvironment;
private readonly IFunction_Error _functionerror;
public FileStreamController(IWebHostEnvironment environment, IFunction_Error functionerror)
{
  _hostingEnvironment = environment;            
}
public IActionResult Index()
{
  return View();
}

[HttpPost]       
public async Task Upload(List file)
{       
  string uploadfolder = Path.Combine(_hostingEnvironment.WebRootPath, "files");      
  foreach (IFormFile item in file)
  {
   if (item.Length > 0)
   {
     string filePath = Path.Combine(uploadfolder, item.FileName);
     using (Stream fileStream = new FileStream(filePath, FileMode.Create))
     {
       await item.CopyToAsync(fileStream);
     }
   }
  }
 return View();
 }
Ok很簡單吧
User:我今天上傳了80MB的檔案出現了以下問題
好吧只好找解法了大概如下
1.Program加入
 serverOptions.Limits.MaxRequestBodySize = long.MaxValue;
 ...
 
2.startup加入
services.Configure(options =>
{
  options.MultipartBodyLengthLimit = long.MaxValue;
  ....
});
 
3.Controller加入
 [DisableRequestSizeLimit]
 
以上三種都沒用最後註解掉
看到一篇加入一個web.config程式碼如下
居然通了80MB上傳沒問題
一直以為.net core是沒web.conifg的
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>
User說:剛剛上傳了150MB的檔案都沒出現錯誤但檔案又沒傳上去
發現List<IFormFile> file是null但後端是有收到
感覺是大小沒問題只不過設定上有些不正確
接著就將startup那段註解的加了回去終於不null了
services.Configure(options =>
{
  options.BufferBodyLengthLimit = long.MaxValue;
  options.KeyLengthLimit = int.MaxValue;
  options.MultipartBodyLengthLimit = long.MaxValue;
  options.MultipartBoundaryLengthLimit = int.MaxValue;
  options.ValueCountLimit = int.MaxValue;
  options.ValueLengthLimit = int.MaxValue;
});
注意上面的MaxValue要修正阿不要真的那麼大還是要依專案來設定
參考來源
.net core issues: 413 Request Entity Too Large nginx
Kestrel web server implementation in ASP.NET Core [资源分享].netcore 部署时遇到413 Request Entity Too Large 和 413Payload Too Large 的问题 asp.net core 3.0 解除文件上传大小限制,500.30、413、api-post-form方法拿不到参数 解决方案 How to increase file upload size in ASP.NET Core https://www.aspsnippets.com/Articles/ASPNet-Core-IFormFile-always-returns-NULL.aspx .Net Core IFormFile 始终为空的问题