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,最后再存到本地文件中