Web API 接口将图片转换为字节,然后返回给客户端,客户端解析:Parameter is not valid

问题:

先看下面代码,我通过接口传过去的是字节

[HttpPost]
public async Task<ActionResult<byte[]>> AddWatermarkAction()
{
    if (Request.HasJsonContentType())
     {
         using Stream stream = HttpContext.Request.BodyReader.AsStream();
         using StreamReader sr = new StreamReader(stream);
         string jsonData = sr.ReadToEnd();
         WatermarkParam param = JsonConvert.DeserializeObject<WatermarkParam>(jsonData);
		 //获取到数据不为空
         if (!param.IsNullOrWhiteSpace())
         {
         	 //对图片进行处理并生成图片字节返回
             byte[] imgBuf = ImgWatermark.AddWatermark(param.WatermarkFile, param.WatermarkText, param.WatermarkPoint, param.WatermarkFont, param.WatermarkColor, param.WatermarkStringFormat);
             return imgBuf;
         }
     }
     return BadRequest("Error!!!");
   }

这样写的话我在客户端只需要获取到接口返回给我的图片字节,然后将其转为图片即可,如下

if (httpResponse.IsSuccessStatusCode)
{
      //获取到处理好的图片数据
      byte[] buf = await httpResponse.Content.ReadAsByteArrayAsync();
      using MemoryStream ms = new MemoryStream(buf);
      //将字节转换为图片
      Image image = Image.FromStream(ms);
      PicShow.Image = image;
  }

但是当图片走到 Image image = Image.FromStream(ms); 这一步时,就报 Parameter is not valid 异常。
后面将客户端获取到的图片字节数组对比接口端生成的图片字节数组,发现两个字节不一样,所以导致我在客户端将其重新转换为图片失败,经过分析,如果不对需要传递的字节数进行加密的话,就会导致传递的字节不一致,导致报错,同样,我们也可以将其转换成 Json 字符串防止修改。

解决办法:

在传递的时候将 字节数组进行加密,接受的时候再用相同的办法进行解密即可
接口修改后

[HttpPost]
public async Task<ActionResult<string>> AddWatermarkAction()
{
    try
    {
        if (Request.HasJsonContentType())
        {
            using Stream stream = HttpContext.Request.BodyReader.AsStream();
            using StreamReader sr = new StreamReader(stream);
            string jsonData = sr.ReadToEnd();
            WatermarkParam param = JsonConvert.DeserializeObject<WatermarkParam>(jsonData);

            if (!param.IsNullOrWhiteSpace())
            {
                byte[] imgBuf = ImgWatermark.AddWatermark(param.WatermarkFile, param.WatermarkText, param.WatermarkPoint, param.WatermarkFont, param.WatermarkColor, param.WatermarkStringFormat);
                //将图片字节加密一下,不然传递过去字节数组会发生变化
                string str = Convert.ToBase64String(imgBuf);
                int count = str.Length;
                return str;
            }
        }
        return BadRequest("Error!!!");
    }
    catch
    {
        return BadRequest("Error Exception!!!");
    }
}

客户端接受修改:

if (httpResponse.IsSuccessStatusCode)
{
    //获取到处理好的图片数据
    string retStr = await httpResponse.Content.ReadAsStringAsync();
    //解密
    byte[] buf = Convert.FromBase64String(retStr);
    using MemoryStream ms = new MemoryStream(buf);
    //将字节转换为图片
    Image image = Image.FromStream(ms);
    PicShow.Image = image;
    //image.Dispose();//这里赋值给 PicShow 了,不能销毁
    this.Btn_Save.Enabled = true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值