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

在SQL Server中以VarBinary(max)存储图片遇Postman 415错误求助

问题描述

尝试将图片以varbinary(max)类型直接存储到SQL Server数据库(而非存储图片路径),但使用Postman调用接口时收到415错误:

{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13", "title": "Unsupported Media Type", "status": 415, "traceId": "00-5c63bce07398c7b9f783284b002f6d7b-01826e2bbd2b43a1-00" }

相关实现代码如下:

Service层代码

public static async Task<Boolean> AddImage(string conString, Image imageToAdd)
{
    try
    {
        using (SqlConnection con = new SqlConnection(conString))
        {
            string addImage = "INSERT INTO [Image] ( imageData) VALUES ( @imageData)";
            using (SqlCommand queryAddImage = new SqlCommand(addImage))
            {
                queryAddImage.Connection = con;
                queryAddImage.Parameters.Add("@imageData", SqlDbType.VarBinary).Value = imageToAdd.ImageData;
                con.Open();
                queryAddImage.ExecuteNonQuery();
                con.Close();
                return true;
            }
        }
    }
    catch (Exception ex)
    {
        throw;
    }
}

Logic层代码

public static async Task<Response> AddImage(string conString, Image imageToAdd)
{
    Response response= new Response();
    try
    {
        if(await ImageService.AddImage(conString, imageToAdd))
        {
            response.StatusCode = StatusCodes.SUCCESS;
            response.Message = "Image was added to Catalog";
        }
    }
    catch (Exception ex)
    {
        response.StatusCode = StatusCodes.INTERNALSERVERERROR;
        response.Message = ex.ToString();
    }
    return response;
}

Controller层代码

[HttpPost]
public async Task<IActionResult> AddImage(Image imageToAdd)
{
    string CS = _configuration.GetConnectionString("WebApiDatabase");
    Response response = await ImageLogic.AddImage(CS, imageToAdd);
    if(response.StatusCode != ComfyCatalogBLL.Utils.StatusCodes.SUCCESS)
    {
        return StatusCode((int)response.StatusCode);
    }
    return new JsonResult(response);
}

Model层代码

public class Image
{
    public int ImageID { get; set; }
    public byte[] ImageData { get; set; }


    public Image() { }

    /// <summary>
    /// 构造函数用于从SqlDataReader获取数据并转换为Image对象
    /// 位于DAL层,接收数据转换为对象
    /// </summary>
    /// <param name="rdr">SqlDataReader</param>
    public Image(SqlDataReader rdr)
    {
        this.ImageID = Convert.ToInt32(rdr["imageID"]);
        object imageDataObj = rdr["imageData"];
        if (imageDataObj != DBNull.Value)
        {
            this.ImageData = (byte[])imageDataObj;
        }
    }
}

烦请帮忙排查问题所在?


问题排查与解决方案

415错误表示服务器无法处理请求中携带的媒体类型,核心问题在于接口接收逻辑与实际请求方式不匹配:

1. 核心原因

当前Controller方法直接接收Image类型参数,默认期望JSON格式请求体,但你实际要上传的是图片文件(通常为multipart/form-data格式),ASP.NET Core无法自动将图片文件映射到Image模型的byte[]属性,因此抛出415错误。

2. 解决方案

修改Controller逻辑,直接接收上传的文件并转换为字节数组,同时调整Postman请求配置:

步骤1:修改Controller方法

将参数改为IFormFile类型,处理上传文件并转换为字节数组:

[HttpPost]
public async Task<IActionResult> AddImage(IFormFile imageFile)
{
    if (imageFile == null || imageFile.Length == 0)
    {
        return BadRequest("未上传有效图片");
    }

    string CS = _configuration.GetConnectionString("WebApiDatabase");
    byte[] imageData;
    using (var ms = new MemoryStream())
    {
        await imageFile.CopyToAsync(ms);
        imageData = ms.ToArray();
    }

    var imageToAdd = new Image { ImageData = imageData };
    Response response = await ImageLogic.AddImage(CS, imageToAdd);
    
    if(response.StatusCode != ComfyCatalogBLL.Utils.StatusCodes.SUCCESS)
    {
        return StatusCode((int)response.StatusCode);
    }
    return new JsonResult(response);
}

步骤2:Postman请求配置

  • 请求方式:POST
  • 请求地址:对应接口URL
  • 请求体:选择form-data
  • 新增键值对:键名设为imageFile(需与Controller参数名一致),类型选File,选择本地图片文件上传
  • 无需手动设置Content-Type,Postman会自动添加正确的multipart/form-data头部

额外优化建议

  • Service层中,SqlDbType.VarBinary建议改为SqlDbType.VarBinaryMax,匹配数据库的varbinary(max)类型:
queryAddImage.Parameters.Add("@imageData", SqlDbType.VarBinaryMax).Value = imageToAdd.ImageData;
  • 将ExecuteNonQuery改为异步版本await queryAddImage.ExecuteNonQueryAsync();,保持全异步流程
  • 无需手动调用con.Close();,using块会自动释放连接资源

内容的提问来源于stack exchange,提问作者nuno veloso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:34:59