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
相关产品推荐
相关产品推荐

