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

