C# 将图片转化为string用form表单提交,后台接受并存储

阅读更多
后台处理代码:
HttpRequest request = System.Web.HttpContext.Current.Request;

            string name = request.Form["name"].ToString();
            string pwd = request.Form["pwd"].ToString();
            string img = request.Form["img"].ToString();   //图片是先转byte数组,然后ToBase64String,最后在做UrlEncode

            string array = HttpUtility.UrlDecode(img);   //将数据转为未做UrlEncode时的串
            array = array.Replace(' ','+');      //将空格用+补齐
            byte[] old;
            try
            {
                old = Convert.FromBase64String(array);    //将ToBase64的串,还原为byte数组
            }
            catch(Exception e)
            {
                return ResponseResult.GenFaildResponse(e.Message);
            }
            CreateImageFromBytes("file1", old);              //调用方法保存在本地
            
            return ResponseResult.GenSuccessResponse(ResultCode.Success);



控制台发送数据
string url = "http://localhost:4806/WebApi/V1/Account/ChangeUserCard3";
            string userName = "123";
            string userPwd = "456";
            string jpegPath = "c:\\123456.png";

            //将图片转化为byte[]再转化为string
            string array = Convert.ToBase64String(ReadImageFile(jpegPath));
            string img = HttpUtility.UrlEncode(array);
            //构造post提交字段
            string para = "name="+userName + "&pwd=" + userPwd + "&img=" + img;

            #region HttpWebRequest写法
            HttpWebRequest httpWeb = (HttpWebRequest)WebRequest.Create(url);
            //httpWeb.Timeout = 20000;   //超时时间可以不设置
            httpWeb.Method = "POST";
            httpWeb.ContentType = "application/x-www-form-urlencoded";
            byte[] bytePara = Encoding.ASCII.GetBytes(para);
            using (Stream reqStream = httpWeb.GetRequestStream())
            {
                //提交数据
                reqStream.Write(bytePara, 0, para.Length);
            }
            //获取服务器返回值
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWeb.GetResponse();
            Stream stream = httpWebResponse.GetResponseStream();
            StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
            //获得返回值
            string result = streamReader.ReadToEnd();
            stream.Close();

            #endregion
            Console.WriteLine(result);
            Console.ReadKey();



服务端用到的两个子方法:
#region 将byte[]转为 Image对象
        /// 
        /// 将byte[]转为 Image对象
        /// 
        /// 图片的byte数组
        /// 
        public static Image BytesToImage(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream(buffer);
            Image image = System.Drawing.Image.FromStream(ms);
            return image;
        }
        #endregion

        #region 将byte[] 转为图片并保存到本地
        /// 
        /// 将byte[] 转为图片并保存到本地
        /// 
        /// 要保存的文件名(不带后缀)
        /// 二进制图片
        /// 
        public static string CreateImageFromBytes(string fileName, byte[] buffer)
        {
            string file = fileName;
            Image image = BytesToImage(buffer);
            ImageFormat format = image.RawFormat;
            if (format.Equals(ImageFormat.Jpeg))
            {
                file += ".jpeg";
            }
            else if (format.Equals(ImageFormat.Png))
            {
                file += ".png";
            }
            else if (format.Equals(ImageFormat.Bmp))
            {
                file += ".bmp";
            }
            else if (format.Equals(ImageFormat.Gif))
            {
                file += ".gif";
            }
            else if (format.Equals(ImageFormat.Icon))
            {
                file += ".icon";
            }
            System.IO.FileInfo info = new System.IO.FileInfo(file);
            System.IO.Directory.CreateDirectory(info.Directory.FullName);
            File.WriteAllBytes(file, buffer);
            return file;
        }
        #endregion




备注:
转化和接收的原理:
1、在发送时将图片转成byte数组
2、将数组进行ToBase64String
3、最后在对串进行UrlEncode操作
4、将最后的参数以常用参数形式发送到服务端

5、服务端接收图片字符串后,先UrlDecode(处理后可能会有空格,如果有空格,需要用+做替换,否则base的时候会提示字符串格式不正确),再FromBase63String,最后再存到本地文件中

你可能感兴趣的:(c#)