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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:15:04