java中关于json传图片的方法

  一般来说传图片可以以流的形式来传输,即便是用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的,也就是说压缩还是可取的。

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

时间: 2024-10-06 07:09:14

java中关于json传图片的方法的相关文章

Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】

转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为“??”. 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=

JMeter中对于Json数据的处理方法

http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ Json作为一种数据交换格式在网络开发,特别是Ajax与Restful架构中应用的越来越广泛.而Apache的JMeter也是较受欢迎的压力测试工具之一,但是它本身没有提供对于Json数据的响应处理.本文中假设需要从HTTP的响应头中返回的Json格式的数据流中抽取某些特定的数据,数据格式如下: { "name":"Sim

java中获取日期和时间的方法总结

1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); date.getTime() ; 还有一种方式,使用 System.currentTimeMillis() ;都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数 一.获取当前时间,   格式为:   yyyy-mm-dd   hh-mm

JAVA中使用JSON进行数据传递

在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JSON字符串来传递数据并在WEB前端或者Android客户端使用JSON来解析接收到的数据. 首先,在JAVA中使用JSON需要引入 org.json 包(点击 这里 可以下载相应的JAR包!), 并在程序中引入相应的JSON类: import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 其

java中遍历MAP的几种方法

java中遍历MAP的几种方法 Java代码 Map<String,String> map=new HashMap<String,String>();    map.put("username", "qq");    map.put("passWord", "123");    map.put("userID", "1");    map.put("em

Java中的五种单例模式实现方法

[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package s

JAVA中,JSON MAP LIST的相互转换

1 JSON包含对象和数组,对应于JAVA中的JSONObject,JSONArray 2 String 转JSON对象 JSONObject.fromObject("String"); String 转JSON数组 JSONArray.fromObject("String"); 3 List 和 JSON互转 JSONObject.toBean() JSONArray.fromObject(List) JAVA中,JSON MAP LIST的相互转换,布布扣,bu

Java基础---Java中无参数无返回值方法使用(三十六)

Java 中无参无返回值方法的使用 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 " welcome to imooc. " 注意哦: 1. 方法体放在一对大括号中,实现特定的操作 2. 方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式 第二步,调用方法 当需要调用方法执行某个操作

Java基础---Java中无参数带返回值方法的使用(三十七)

Java 中无参带返回值方法的使用 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值. 调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理.如: 运行结果: 不容忽视的"小陷阱&