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

ASP.NET Core MVC中文件上传存库及下载功能实现方法

ASP.NET Core MVC 文件二进制存储到数据库及下载、检索实现方案

1. 定义数据库实体模型

首先创建对应数据库表的实体类,用于存储文件元数据和二进制内容:

public class Files
{
    public int DocumentId { get; set; } // 主键
    public string Name { get; set; } // 生成的唯一文件名
    public string FileType { get; set; } // 文件扩展名
    public DateTime CreatedOn { get; set; } // 上传时间
    public byte[] DataFiles { get; set; } // 文件二进制数据
}

2. 文件上传控制器动作

将上传文件转成二进制格式并保存到数据库,优化后的实现代码:

public IActionResult Index(IFormFile file)
{
    if (file != null && file.Length > 0)
    {
        var fileName = Path.GetFileName(file.FileName);
        var fileExtension = Path.GetExtension(fileName);
        // 用Guid生成唯一文件名避免重复
        var newFileName = $"{Guid.NewGuid()}{fileExtension}";

        var fileEntity = new Files()
        {
            Name = newFileName,
            FileType = fileExtension,
            CreatedOn = DateTime.Now
        };

        // 将文件流转换为二进制数组
        using (var memoryStream = new MemoryStream())
        {
            file.CopyTo(memoryStream);
            fileEntity.DataFiles = memoryStream.ToArray();
        }

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

    return View();
}

3. 文件下载控制器动作

根据文件ID从数据库读取二进制数据,返回给用户下载:

public IActionResult Download(int documentId)
{
    var fileEntity = _context.Files.FirstOrDefault(f => f.DocumentId == documentId);
    if (fileEntity == null)
    {
        return NotFound("未找到指定文件");
    }

    // 根据文件扩展名匹配对应MIME类型
    var contentType = GetContentType(fileEntity.FileType);
    // 返回文件流并指定下载文件名
    return File(fileEntity.DataFiles, contentType, fileEntity.Name);
}

// 辅助方法:映射扩展名到MIME类型
private string GetContentType(string fileExtension)
{
    return fileExtension.ToLower() switch
    {
        ".pdf" => "application/pdf",
        ".jpg" or ".jpeg" => "image/jpeg",
        ".png" => "image/png",
        ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        _ => "application/octet-stream" // 默认二进制流类型
    };
}

4. 从数据库检索二进制文件数据

实现控制器动作读取数据库中的二进制文件数据,可用于展示或后续业务处理:

public IActionResult RetrieveFileData(int documentId)
{
    var fileEntity = _context.Files.FirstOrDefault(f => f.DocumentId == documentId);
    if (fileEntity == null)
    {
        return NotFound("文件不存在");
    }

    // 示例:返回包含文件信息和Base64编码的二进制数据
    return Json(new
    {
        DocumentId = fileEntity.DocumentId,
        FileName = fileEntity.Name,
        FileType = fileEntity.FileType,
        Base64Data = Convert.ToBase64String(fileEntity.DataFiles)
    });
}

5. 上传表单视图

在Index.cshtml中添加支持文件上传的表单:

<form asp-action="Index" enctype="multipart/form-data" method="post">
    <div>
        <input type="file" name="file" accept=".pdf,.jpg,.png,.docx,.xlsx" />
    </div>
    <button type="submit" class="btn btn-primary">上传文件</button>
</form>

注意事项

  • 上传大小限制:ASP.NET Core默认限制上传文件大小为30MB,如需调整,在Program.cs中配置:
    builder.Services.Configure<FormOptions>(options =>
    {
        options.MultipartBodyLengthLimit = 50 * 1024 * 1024; // 设置为50MB
    });
    
  • DbContext配置:确保你的DbContext已正确注册并包含DbSet<Files>:
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
        public DbSet<Files> Files { get; set; }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:21:40