C# 与 Java 通过Base64传送图片

来源:互联网 发布:can数据帧格式 编辑:程序博客网 时间:2024/06/05 02:33

通过winform上传图片到java服务器,使用C#的webclient.uploadFile上传图片,但不知为什么在java服务器端(struts2)的action中获取不到上传的文件,研究了半天也没结果,所以尝试使用Base64将图片转成字符串,然后http传给java服务器。

按理Base64标准是统一的,C#转Base64字符串再使用Java把字符串解码成图片,所以上百度搜了半天代码,

C#代码:

Bitmap bmp = new Bitmap(文件路径);MemoryStream ms = new MemoryStream();bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);byte[] fileBytes = new byte[ms.Length];ms.Position = 0;ms.Read(fileBytes, 0, (int)ms.Length);ms.Close();//http post给后台


Java代码:

String imgFile = request.getParameter("imgFile");BASE64Decoder decoder = new BASE64Decoder();byte[] imgBytes = decoder.decodeBuffer(imgFile);FileOutputStream fos = new FileOutputStream(img);fos.write(imgBytes);fos.close();
这样试了几次不行,解码的图片总是打不开,想了半天,试着用BASE64Encoder将图片转成Base64字符串,发现和C#转换的字符串不一样,然后又是半天百度,搜到的内容就那么几个,没啥用,只好求助google了,嗯,不得不说,搜到了更多的内容,有的说是不能用sun.misc.BASE64Encoder,要用java8的java.util.Base64或者org.apache.commons.codec.binary.Base64,然后就试试吧,难过,奶奶的,都不行。不可能吧,我在想Java端是直接解码保存成图片的,怎么C#端就得先转成Bitmap呢?那我就把Bitmap去了,直接读取图片文件的二进制流,转成Base64,如下:

FileStream fs = new FileStream(文件路径, FileMode.Open, FileAccess.Read);byte[] fileBytes = new byte[fs.Length];fs.Read(fileBytes, 0, (int)fs.Length);//http post给后台

我去,这次编码看起来真的一样,不过java报错,说是Base64字符格式不对?哦哦哦,对比一下,发现是“+”变成“ ”空格了,什么问题,在http传输的时候应该需要转码,但winform没找到转码的方法,就简单点,在java端把空格都替换成“+”,然后解码,OK.

网上搜的转码方法:

public static string UrlEncode(string str){            StringBuilder sb = new StringBuilder();            byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)            for (int i = 0; i < byStr.Length; i++)            {                sb.Append(@"%" + Convert.ToString(byStr[i], 16));            }                        return (sb.ToString());}


成功了!!!!!!!!!!!!



原创粉丝点击