ASP.NET Entity Framework脚手架项目中文件上传的自动化实现方法
在脚手架生成的ASP.NET MVC + Entity Framework项目中快速添加文件上传功能
当然有简便的实现方法,基于脚手架生成的项目,你只需要对实体、视图、控制器做少量修改就能集成文件上传功能,具体步骤如下:
1. 修改实体类,添加文件相关属性
首先在你的实体(比如Product)中增加存储文件信息的属性,两种常见方案可选:
- 方案1:将文件二进制数据直接存在数据库
- 方案2:将文件存储到服务器目录,仅在数据库记录文件路径
示例实体代码:
public class Product { public int Id { get; set; } public string Name { get; set; } // 方案1:存二进制数据到数据库的属性 public string? FileName { get; set; } // 文件名 public string? FileContentType { get; set; } // 文件MIME类型 public byte[]? FileData { get; set; } // 文件二进制数据 // 方案2:存服务器文件路径的属性(二选一即可) // public string? FilePath { get; set; } }
2. 更新数据库上下文并执行迁移
打开Package Manager Console,依次执行以下命令更新数据库:
Add-Migration AddFilePropertiesToProduct Update-Database
3. 修改脚手架生成的视图,添加上传控件
找到Views/[你的实体名]/Create.cshtml和Edit.cshtml,先修改表单标签,添加enctype="multipart/form-data"属性:
<form asp-action="Create" enctype="multipart/form-data">
然后在表单中添加上传文件的控件:
<div class="form-group"> <label class="control-label">上传文件</label> <input type="file" name="uploadFile" class="form-control" /> </div>
4. 修改控制器的提交方法,处理文件上传
在对应的控制器(比如ProductController)中,修改HttpPost的Create和Edit方法,添加文件处理逻辑:
处理Create方法(以数据库存二进制为例)
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,Name")] Product product, IFormFile uploadFile) { if (ModelState.IsValid) { if (uploadFile != null && uploadFile.Length > 0) { // 读取文件二进制数据 using var memoryStream = new MemoryStream(); await uploadFile.CopyToAsync(memoryStream); // 给实体属性赋值 product.FileName = uploadFile.FileName; product.FileContentType = uploadFile.ContentType; product.FileData = memoryStream.ToArray(); } _context.Add(product); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(product); }
处理Edit方法(逻辑类似)
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("Id,Name")] Product product, IFormFile uploadFile) { if (id != product.Id) return NotFound(); if (ModelState.IsValid) { try { if (uploadFile != null && uploadFile.Length > 0) { using var memoryStream = new MemoryStream(); await uploadFile.CopyToAsync(memoryStream); product.FileName = uploadFile.FileName; product.FileContentType = uploadFile.ContentType; product.FileData = memoryStream.ToArray(); } _context.Update(product); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ProductExists(product.Id)) return NotFound(); else throw; } return RedirectToAction(nameof(Index)); } return View(product); }
5. 在详情页展示或下载文件
在Details.cshtml中添加文件展示逻辑:
@if (Model.FileData != null) { <div class="mt-3"> <h5>已上传文件</h5> <!-- 图片文件直接显示 --> @if (Model.FileContentType.StartsWith("image/")) { <img src="data:@Model.FileContentType;base64,@Convert.ToBase64String(Model.FileData)" alt="@Model.FileName" class="img-thumbnail" style="max-width: 300px;" /> } <!-- 其他文件提供下载链接 --> <a href="data:@Model.FileContentType;base64,@Convert.ToBase64String(Model.FileData)" download="@Model.FileName" class="btn btn-primary mt-2">下载文件</a> </div> }
内容的提问来源于stack exchange,提问作者Aug
相关产品推荐
相关产品推荐

