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

ASP.NET Core 3.1文件上传下载报错:NullReferenceException求助

解决ASP.NET Core 3.1文件上传下载的NullReferenceException及功能异常

问题分析

  1. 空引用异常根源:上传完成后,POST请求的Index方法直接返回View(),未传递文件列表模型,导致视图中Model为null,执行@foreach (var item in Model)时抛出空引用异常。
  2. 下载功能失效原因:视图中下载链接传递的路由参数是filename,但控制器的DownloadImage方法接收的是int id,参数不匹配无法定位目标文件。

修复步骤

1. 修正控制器POST方法

修改DemoController的POST版Index方法,上传完成后重定向到GET版Index(避免重复提交问题),确保视图能获取到最新的文件列表模型:

[HttpPost]
public IActionResult Index(IFormFile files)
{
    if (files != null && files.Length > 0)
    {
        var fileName = Path.GetFileName(files.FileName);
        var fileExtension = Path.GetExtension(fileName);
        var newFileName = $"{Guid.NewGuid()}{fileExtension}";

        var objfiles = new Files()
        {
            Name = newFileName,
            FileType = fileExtension,
        };

        using (var target = new MemoryStream())
        {
            files.CopyTo(target);
            objfiles.DataFiles = target.ToArray();
        }

        _context.Files.Add(objfiles);
        _context.SaveChanges();
    }

    // 重定向到GET请求的Index,确保模型被正确传递
    return RedirectToAction(nameof(Index));
}

2. 修正视图下载链接

修改视图中的下载链接,传递正确的DocumentId参数:

<ul>
    @foreach (var item in Model ?? new List<Info.Models.Files>())
    {
        <li>
            <a asp-action="DownloadImage"
               asp-route-id="@item.DocumentId">
                @item.Name
            </a>
        </li>
    }
</ul>

额外优化:添加Model ?? new List<Info.Models.Files>(),即使模型为null也不会抛出异常,提升页面健壮性

3. 可选优化:修正ContentType获取

当前代码中FileType存储的是文件扩展名(如.pdf),但File方法需要标准MIME类型(如application/pdf),可添加MIME类型映射逻辑:

// 在DownloadImage方法中替换ContentType的赋值逻辑
var contentType = GetContentType(item.FileType);

// 新增辅助方法
private string GetContentType(string fileExtension)
{
    var provider = new FileExtensionContentTypeProvider();
    if (!provider.TryGetContentType(fileExtension, out var contentType))
    {
        contentType = "application/octet-stream";
    }
    return contentType;
}

修复后验证

  1. 上传文件后,页面自动重定向到GET版Index,加载最新文件列表,不会再抛出空引用异常。
  2. 点击下载链接时,会正确传递文档ID到DownloadImage方法,实现正常下载。

内容的提问来源于stack exchange,提问作者hhaannyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:15:15