zoukankan      html  css  js  c++  java
  • java中关于json传图片的方法

    摘录自:http://www.cnblogs.com/lilh/p/5352499.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的,也就是说压缩还是可取的。

      最后,我想说上述代码是手打的。。。。。。不是直接在经过测试的代码中复制粘贴的,可能会有细微的字母错误- -。请见谅。

  • 相关阅读:
    JVM字节码-字节码进阶
    JVM字节码-Class文件结构
    CT03 Contest#10 equation 大力打表+讨论
    2021CT03 Contest#9 降智场
    妙妙题 noi.ac 2323 Connecting
    洛谷 P4774 [NOI2018] 屠龙勇士
    [模板] 扩展中国剩余定理
    洛谷 P1082 [NOIP2012 提高组] 同余方程
    洛谷 P1516 青蛙的约会
    2021牛客暑期多校训练营3 Kuriyama Mirai and Exclusive Or
  • 原文地址:https://www.cnblogs.com/haimishasha/p/5671073.html
Copyright © 2011-2022 走看看