ASP.NET Core MVC大视频上传遇System.NullReferenceException问题求助
ASP.NET Core MVC大文件上传NullReferenceException问题修复及视频列表展示
问题原因分析
上传80MB视频时postedFiles为null,核心原因是ASP.NET Core默认限制了请求大小阈值,当请求超过默认值时模型绑定直接失败,导致参数为空。仅在控制器方法添加[RequestFormLimits]不足以覆盖所有层级的限制,需补充多维度配置。
修复大文件上传问题
1. 完善控制器方法属性
在Post请求的Index方法上同时添加[RequestSizeLimit]和[RequestFormLimits],确保请求整体大小和表单多部分数据长度足够容纳大文件:
[HttpPost] [RequestSizeLimit(209715200)] // 200MB [RequestFormLimits(MultipartBodyLengthLimit = 209715200)] public IActionResult Index(List<IFormFile> postedFiles) { // 先判断参数是否为空,避免NullReferenceException if (postedFiles == null || postedFiles.Count == 0) { ViewBag.Message = "请选择要上传的文件"; return View(); } string path = Path.Combine(this.Environment.WebRootPath, "Uploads"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } foreach (IFormFile postedFile in postedFiles) { // 重命名文件避免覆盖,可根据需求调整命名规则 string fileName = $"{Guid.NewGuid()}_{Path.GetFileName(postedFile.FileName)}"; using (FileStream stream = new FileStream(Path.Combine(path, fileName), FileMode.Create)) { postedFile.CopyTo(stream); ViewBag.Message += string.Format("<b>{0}</b> 上传成功.<br />", fileName); } } return View(); }
2. 配置全局请求限制
在Program.cs中添加Controllers服务时,配置全局请求大小限制,避免单个控制器配置遗漏:
builder.Services.AddControllersWithViews(options => { options.MaxRequestBodySize = 209715200; // 200MB });
3. Kestrel服务器配置(自托管场景)
如果使用Kestrel自托管而非IIS部署,需额外配置Kestrel的最大请求大小:
builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxRequestBodySize = 209715200; // 200MB });
4. 确认IIS配置(IIS部署场景)
你的web.config已添加maxAllowedContentLength限制(200MB),该配置针对IIS层面生效,无需修改。
实现已上传视频列表展示
1. 修改控制器Get方法
读取Uploads文件夹中的视频文件,传递给视图:
public IActionResult Index() { string path = Path.Combine(this.Environment.WebRootPath, "Uploads"); List<string> uploadedVideos = new List<string>(); if (Directory.Exists(path)) { // 筛选常见视频格式文件,可根据需求扩展 var videoFiles = Directory.GetFiles(path) .Select(f => Path.GetFileName(f)) .Where(f => f.EndsWith(".mp4") || f.EndsWith(".avi") || f.EndsWith(".mov")); uploadedVideos.AddRange(videoFiles); } ViewBag.UploadedVideos = uploadedVideos; return View(); }
2. 更新Index视图
添加视频列表展示区域,使用HTML5 video标签实现播放功能:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>视频上传与管理</title> <style type="text/css"> body { font-family: Arial; font-size: 10pt; margin: 20px; } .video-list { margin-top: 30px; padding-top: 20px; border-top: 1px solid #ddd; } .video-item { margin-bottom: 25px; padding: 12px; border: 1px solid #eee; border-radius: 6px; } video { max-width: 450px; margin-top: 8px; } </style> </head> <body> <form method="post" enctype="multipart/form-data" asp-controller="Teaching" asp-action="Index"> <span>选择视频文件:</span> <input type="file" name="postedFiles" multiple accept="video/*" /> <!-- 限制仅选择视频类型 --> <input type="submit" value="上传" /> <br /> <span style="color:green">@Html.Raw(ViewBag.Message)</span> <span style="color:red">@Html.Raw(ViewBag.ErrorMessage)</span> </form> <div class="video-list"> <h3>已上传视频</h3> @if (ViewBag.UploadedVideos != null && ViewBag.UploadedVideos.Count > 0) { foreach (var video in ViewBag.UploadedVideos) { <div class="video-item"> <p>@video</p> <video controls> <source src="@Url.Content("~/Uploads/" + video)" type="video/mp4"> 您的浏览器不支持HTML5视频播放。 </video> </div> } } else { <p>暂无已上传视频</p> } </div> </body> </html>
额外注意事项
- 文件权限:确保应用程序对Uploads文件夹拥有读写权限,避免保存文件时出现权限异常。
- 大文件体验:如需上传更大文件或显示上传进度,可改用AJAX异步上传方案,提升用户体验。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

