C# webapi 文件流 stream 两种上传方式《第二部分 base64 图片上传》

 博客仅用于记录工作学习中遇到的坑,欢迎交流!

2.base64 图片上传

2.1 客户端

/// <summary>
        /// 接口保存图片
        /// </summary>
        /// <param name="pic_width"></param>
        /// <param name="pic_height"></param>
        /// <param name="bitMapData"></param>
        /// <param name="saveType"></param>
        /// <returns></returns>
        public static string SaveLearningImage(int pic_width, int pic_height, string bitMapData, string url, int saveType = 1)
        {
            var requstData = new
            {
                pic_width = pic_width,
                pic_height = pic_height,
                bitMapData = bitMapData,
                saveType = saveType
            };
            return HttpPostRequst(url, JsonConvert.SerializeObject(requstData), "");
        }

2.2 webapi(附上整个代码)

  [FromBody]
    /// <summary>
    /// 图片上传
    /// </summary>
    public class ImageSaveController : ApiController
    {
        /// <summary>
        /// 保存图片
        /// </summary>
        //public class SaveImage
        //{
        private object _lock = new object();
        /// <summary>
        /// 保存学习网图片
        /// </summary>
        /// <param name="pic_width"></param>
        /// <param name="pic_height"></param>
        /// <param name="bitMapData"></param>

        [HttpPost]
        //public string SaveLearningImage(int pic_width, int pic_height, dynamic  string bitMapData, int saveType = 4)
        public string SaveLearningImage([FromBody] Object  bit)
    
        {
            lock (_lock)
            {
                //JavaScriptSerializer jss = new JavaScriptSerializer();
                //string myJson = jss.Serialize(bitMapData);
                //return myJson;
                string jsonstr = JsonConvert.SerializeObject(bit);
                Data res = JsonConvert.DeserializeObject<Data>(jsonstr);
                //Data res = new Data
                //{
                //    BitMapData = ((Newtonsoft.Json.Linq.JContainer)(bit)).First
                //};
                return SavePhoto(res.pic_width, res.pic_height, res.BitMapData, res.saveType);
            }
        }
        private class Data {
          public string BitMapData { get; set; }
          public int pic_width { get; set; }
          public int pic_height { get; set; }
         public int saveType { get; set; }

        }
        private string SavePhoto(int pic_width, int pic_height, string bitMapData, int saveType)
        {
            byte[] bitmap_data = Convert.FromBase64String(bitMapData);
            int PhotoD = 170;
            Stream stream = new MemoryStream(bitmap_data);
            var m_pic = new Bitmap(stream);
            string Year = System.DateTime.Now.Year.ToString();
            string Month = System.DateTime.Now.Month.ToString();
            string Day = System.DateTime.Now.Day.ToString();
            string Hour = System.DateTime.Now.Hour.ToString();

            string ConfigPath = "", filePath = "";
            switch (saveType)
            {
                case 4:
                    {
                        ConfigPath = ConfigurationManager.AppSettings["LearPicPath"];
                        filePath = "/imagepath/onlinephoto/";
                        break;
                    }
                case 1:
                    {
                        ConfigPath = ConfigurationManager.AppSettings["LearPicPath_Theory"];
                        filePath = "/";
                        break;
                    }
            }

            filePath += Year + "/" + Month + "/" + Day + "/" + Hour + "/";
            //判断路径是否存在,若不存在则创建路径
            DirectoryInfo upDir = new DirectoryInfo(ConfigPath + filePath);
            if (!upDir.Exists)
            {
                upDir.Create();
            }

            //生成随机文件名                
            DateTime date = DateTime.Now;
            string fileName = Guid.NewGuid().ToString() + ".jpg";
            int towidth = pic_width;
            int toheight = pic_height;

            //towidth = PhotoD;
            //toheight = PhotoD;

            int width = pic_width;
            int height = pic_height;

            int x = 0;
            int y = 0;
            int ow = m_pic.Width;
            int oh = m_pic.Height;

            switch (ThumbnailMode.Cut)
            {
                case ThumbnailMode.HW://指定高宽缩放(可能变形)                
                    break;
                case ThumbnailMode.W://指定宽,高按比例                    
                    toheight = m_pic.Height * width / m_pic.Width;
                    break;
                case ThumbnailMode.H://指定高,宽按比例
                    towidth = m_pic.Width * height / m_pic.Height;
                    break;
                case ThumbnailMode.Cut://指定高宽裁减(不变形)                
                    if ((double)m_pic.Width / (double)m_pic.Height > (double)towidth / (double)toheight)
                    {
                        oh = m_pic.Height;
                        ow = m_pic.Height * towidth / toheight;
                        y = 0;
                        x = (m_pic.Width - ow) / 2;
                    }
                    else
                    {
                        ow = m_pic.Width;
                        oh = m_pic.Width * height / towidth;
                        x = 0;
                        y = (m_pic.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }
            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
            //新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空画布并以透明背景色填充
            g.Clear(Color.Transparent);
            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(m_pic, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);
            string fullPath = ConfigPath + filePath + fileName;
            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(fullPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                m_pic.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
            return filePath + fileName;
        }

        /// <summary>
        /// 缩略图格式
        /// </summary>
        public enum ThumbnailMode
        {
            /// <summary>
            /// 指定高宽缩放(可能变形)。 
            /// </summary>
            HW,
            /// <summary>
            /// 指定宽,高按比例。 
            /// </summary>
            W,
            /// <summary>
            /// 指定高,宽按比例。 
            /// </summary>
            H,
            /// <summary>
            /// 指定高宽裁减(不变形)。 
            /// </summary>
            Cut
        }
    }

图片上传的比较简单,base64对图片来说,还是比较方便的,不论是前端还是后端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值