You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:08:09