.Net 5中如何POST上传含图片的模型并保存图片到文件系统、存路径到数据库
.NET 5 Web API 同时提交模型数据与图片文件实现方案
步骤1:创建接收请求的复合模型
需要新增一个同时包含模型字段和文件字段的请求DTO,用于接收multipart/form-data类型的请求内容:
public class DocumentUploadRequest { // 原Document模型的业务字段 public string name { get; set; } // 上传的图片文件字段 public IFormFile ImageFile { get; set; } }
步骤2:改造上传接口逻辑
新增专门处理带业务数据的上传接口,同时修复原有单文件上传的异步缺失、目录校验、文件重名等问题:
[Route("api/Documents")] public class DocumentsController : Controller { private readonly AppDbContext _dbContext; // 替换为你自己的数据库上下文类 private readonly IWebHostEnvironment _webHostEnvironment; // 构造注入依赖 public DocumentsController(AppDbContext dbContext, IWebHostEnvironment webHostEnvironment) { _dbContext = dbContext; _webHostEnvironment = webHostEnvironment; } [HttpPost("upload-with-data")] public async Task<IActionResult> UploadDocumentWithImage([FromForm] DocumentUploadRequest request) { // 参数校验 if (request == null || request.ImageFile == null || request.ImageFile.Length == 0) return BadRequest("请求参数不完整"); try { // 1. 初始化图片存储目录 var imageSaveDir = Path.Combine(_webHostEnvironment.WebRootPath, "images"); // 目录不存在则自动创建 if (!Directory.Exists(imageSaveDir)) Directory.CreateDirectory(imageSaveDir); // 2. 生成唯一文件名避免覆盖,保留原文件后缀 var fileExtension = Path.GetExtension(request.ImageFile.FileName); var uniqueFileName = $"{Guid.NewGuid()}{fileExtension}"; var fileSaveFullPath = Path.Combine(imageSaveDir, uniqueFileName); // 3. 异步保存文件到本地文件系统 await using (var stream = new FileStream(fileSaveFullPath, FileMode.Create)) { await request.ImageFile.CopyToAsync(stream); } // 4. 生成图片可访问路径,准备存入数据库 var imageAccessUrl = $"/images/{uniqueFileName}"; // 5. 保存完整Document数据到数据库 var newDocument = new Document { name = request.name, imageUrl = imageAccessUrl }; _dbContext.Documents.Add(newDocument); await _dbContext.SaveChangesAsync(); return Ok(new { DocumentId = newDocument.id, DocumentName = newDocument.name, ImageAccessUrl = newDocument.imageUrl }); } catch (Exception ex) { // 可自行添加异常日志逻辑 return StatusCode(500, "上传失败:" + ex.Message); } } }
步骤3:前端调用要求
请求必须使用multipart/form-data编码类型,表单字段对应规则:
name:字符串类型,对应Document的名称字段ImageFile:文件类型,对应上传的图片文件
注意事项
- 确保Startup.cs/Program.cs中已经启用静态文件中间件,才能通过生成的
/images/xxx路径访问图片,配置代码参考:
app.UseStaticFiles(); // 需要放在路由配置之前
- 可根据业务需要在参数校验环节添加文件限制逻辑,比如仅允许jpg/png格式、文件大小不超过2M等。
原有单文件上传代码缺少await关键字修饰CopyToAsync方法,会导致文件还没写完就返回请求,可能出现文件损坏的问题,建议同步修正。
内容的提问来源于stack exchange,提问作者esamaldin elzain
相关产品推荐
相关产品推荐

