java中关于json传图片的方法

本文转自:http://www.cnblogs.com/yxy2016/articles/5509095.html


一般来说传图片可以以流的形式来传输,即便是用json传输,一般也都是传一个地址,而图片都存在服务器上,然后顺着地址发送请求下载图片。

  但是这次公司的项目中,图片是存在oracle数据库中的blob字段的,并没有存在服务器上,也就是说我必须传图片本身过去,而json是无法传输二进制的文本格式,因此我就想将图片转为字符串形式传输,然后对方再解码然后转换回来就行了。

  我的方法分三个步骤:

    1.将图片转为字节数组

    2.将字节数组转为字符串

    3.压缩字符串,放入json传输

  首先是第一步,将图片转为字节数组,代码如下:

复制代码
复制代码
 1 /**
 2 * 将图片转换为字节数组
 3 * @return  4 */  5 private byte[] loadImage(File file){  6 //用于返回的字节数组  7 byte[] data=null;  8 //打开文件输入流  9 FileInputStream fin=null; 10 //打开字节输出流 11 ByteArrayOutputStream bout=null; 12 try{ 13 //文件输入流获取对应文件 14 fin=new FileInputStream(file); 15 //输出流定义缓冲区大小 16 bout=new ByteArrayOutputStream((int)file.length); 17 //定义字节数组,用于读取文件流 18 byte[] buffer=new byte[1024]; 19 //用于表示读取的位置 20 int len=-1; 21 //开始读取文件 22 while((len=fin.read(buffer))!=-1){ 23 //从buffer的第0位置开始,读取至第len位置,结果写入bout 24 bout.write(buffer,0,len); 25  } 26 //将输出流转为字节数组 27 data=bout.toByteArray(); 28 //关闭输入输出流 29  fin.close(); 30  bout.close(); 31 }catch(Exception e){ 32  e.printStackTrace(); 33  } 34 return data; 35 }
复制代码
复制代码

  然后是第二步,将字节数组转为字符串

复制代码
复制代码
 1 /**
 2 * 把字节数组转化为字符串----"ISO-8859-1"
 3 * @param date  4 * @return  5 */  6 private String byteToString(byte[] data){  7 String dataString=null;  8 try{  9 //将字节数组转为字符串,编码格式为ISO-8859-1 10 dataString=new String(data,"ISO-8859-1"); 11 }catch(Exception e){ 12  e.printStackTrace(); 13  } 14 return dataString; 15 }
复制代码
复制代码

  接下来就是最后一步,将字符串压缩后返回

复制代码
复制代码
 1 /**
 2 * 压缩字符串----"ISO-8859-1"
 3 * @param data  4 * @return  5 */  6 private String compress(String data){  7 String finalData=null;  8 try{  9 //打开字节输出流 10 ByteArrayOutputStream bout=new ByteArrayOutputStream(); 11 //打开压缩用的输出流,压缩后的结果放在bout中 12 GZIPOutpuStream gout=new GZIPOutputStream(bout); 13 //写入待压缩的字节数组 14 gout.write(data.getBytes("ISO-8859-1")); 15 //完成压缩写入 16  gout.finish(); 17 //关闭输出流 18  gout.close(); 19 finalData=bout.toString("ISO-8859-1"); 20 }catch(Exception e){ 21  e.printStackTrace(); 22  } 23 return finalData; 24 }
复制代码
复制代码

  以上就是我所用的方法,有些不熟悉的地方习惯于一句话一个注释算是我的习惯吧,可能会让人看起来比较乱,请不要介意,而且有些注释都是我自己猜测的,并不一定准确,如果错了还请指出来,谢谢了!

  然后说下我当时写这方法的一些琐碎的事情吧,当时一开始我确实是想着转字符串传输,但是毕竟没写过,因此也在网上查阅过,百度上很多都说转 Base64格式字符串传输,我试了很多遍,然而可能是我哪里写的不对,导致一直没有成功,我的测试方法是从数据库中取出那个blob字段的数据,然后经 过转化压缩,然后在本地生成一个图片,但是最终我发现那个图片都是打不开的,提示文件错误或损坏,并且图片大小也有点怪异,估计是我哪里代码写的不对吧。

  然后我就干脆不转Base64了,但是不设置编码格式肯定是不行的,后来又在aawwmate的博客中看到了一个转载的文章,也是关于json传输图片的,看完后我就按照那篇文章中说的用ISO-8859-1格式来传输,确实就成功了,在此万分感谢。

  相信大家在代码中也看见了那个压缩字符串的时候,实际上是将字符串转为字节数组压缩完后又转为字符串的吧,为什么要多此一举,不直接将字节数组 压缩后再转为字符串呢,这方面其实我自己也想过,但是我试了还是老样子,就是本地生成的图片打不开,以后有时间再去试试能不能改改看。

  关于压缩的话我当时测试了下,实际上是对于小图片是会导致图片变大的,当时好像测试的是一个3k的原图片,经过上面三个步骤以后,在本地解码解压转换生成的图片却是5k的,但是我又试了一个17k的图片,最终生成的图片是10k的,也就是说压缩还是可取的。


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值