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

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

  我的方法分三个步骤:

    1.将图片转为字节数组

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

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

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

 /**
* 将图片转换为字节数组
* @return
*/
private byte[] loadImage(File file){
//用于返回的字节数组
byte[] data=null;
//打开文件输入流
FileInputStream fin=null;
//打开字节输出流
ByteArrayOutputStream bout=null;
try{
//文件输入流获取对应文件
fin=new FileInputStream(file);
//输出流定义缓冲区大小
bout=new ByteArrayOutputStream((int)file.length);
//定义字节数组,用于读取文件流
byte[] buffer=new byte[1024];
//用于表示读取的位置
int len=-1;
//开始读取文件
while((len=fin.read(buffer))!=-1){
//从buffer的第0位置开始,读取至第len位置,结果写入bout
bout.write(buffer,0,len);
}
//将输出流转为字节数组
data=bout.toByteArray();
//关闭输入输出流
fin.close();
bout.close();
}catch(Exception e){
e.printStackTrace();
}
return data;
}

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

 /**
* 把字节数组转化为字符串----"ISO-8859-1"
* @param date
* @return
*/
private String byteToString(byte[] data){
String dataString=null;
try{
//将字节数组转为字符串,编码格式为ISO-8859-1
dataString=new String(data,"ISO-8859-1");
}catch(Exception e){
e.printStackTrace();
}
return dataString;
}

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

 /**
* 压缩字符串----"ISO-8859-1"
* @param data
* @return
*/
private String compress(String data){
String finalData=null;
try{
//打开字节输出流
ByteArrayOutputStream bout=new ByteArrayOutputStream();
//打开压缩用的输出流,压缩后的结果放在bout中
GZIPOutpuStream gout=new GZIPOutputStream(bout);
//写入待压缩的字节数组
gout.write(data.getBytes("ISO-8859-1"));
//完成压缩写入
gout.finish();
//关闭输出流
gout.close();
finalData=bout.toString("ISO-8859-1");
}catch(Exception e){
e.printStackTrace();
}
return finalData;
}

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

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

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

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

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

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

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

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

    转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...

  2. SpringMVC中使用Json传数据

    在web项目中使用Json进行数据的传输是非常常见且有用的,在这里介绍下在SpringMVC中使用Json传数据的一种方法,在我的使用中,主要包括下面四个部分(我个人喜好使用maven这类型工具进行项 ...

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

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  4. JAVA中使用JSON进行数据传递

    最近在做一个基于JAVA Servlet的WEB应用以及对应的Anroid应用客户端的开发工作. 其中,在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JS ...

  5. 转载:JAVA中使用JSON进行数据传递

    转载网址:http://www.cnblogs.com/undead/archive/2012/07/18/2594900.html 最近在做一个基于JAVA Servlet的WEB应用以及对应的An ...

  6. Java中的Json序列化,不容忽视的getter

    在开发的过程中,经常会碰到和自己预期不一样的情况.有的时候自己去研究一下还是很有趣的.这两天在写java web的时候,碰到了一个对象序列化的问题. 问题重现 public class AjaxJso ...

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

    JMeter中对于Json数据的处理方法 http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ J ...

  8. 3、示例(在java中使用JSON)

    教程链接(json-smple1.1.1.jar文件) 链接:http://pan.baidu.com/s/1qXPbYHm 密码:v0f0 如何使用java编程语言编码和解码JSON 首先准备环境以 ...

  9. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

随机推荐

  1. Hard-Margin SVM(支持向量机)

    什么是Hard-Margin SVM?指的是这个向量机只适用于“数据完全可分(seperately)”的情况. (一)什么是支持向量机? 上述三条直线,选择哪一条比较好?直觉上来说,最右面的那条直线最 ...

  2. 一个使用微软Azure blob实现文件下载功能的实例-附带源文件

    Running the sample Please follow the steps below. Step 1: Open the CSAzureServeFilesFromBlobStorage. ...

  3. Tkinter教程之Toplevel篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811341 '''Tkinter教程之Toplevel篇'''#TopLevel与Frame类 ...

  4. css 超出部分显示省略号

    代码: overflow: hidden; white-space: nowrap;  text-overflow: ellipsis; 重点代码:text-overflow: ellipsis; 解 ...

  5. 一个通用的Makefile (转)

    据http://bbs.chinaunix.net/thread-2300778-1-1.html的讨论,发现还是有很多人在问通用Makefile的问题,这里做一个总结.也作为以后的参考.       ...

  6. HTTPS 升级指南

    上一篇文章我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效. 为了升级到 HTTP/2 协议,必须先启用 HTTPS.如果你不了解 HTTPS 协议(学名 TLS 协议),可以参考我 ...

  7. 【转】Nginx系列(五)--nginx+tomcat实现负载均衡

    原博文出于:  http://blog.csdn.net/liutengteng130/article/details/47129909   感谢! Nginx占有内存少,并发能力强,事实上Nginx ...

  8. angular的注入实现

    angular需要对用户的传入函数进行静态分析,抽取当中的依赖,才能工作.因此用户的函数,包括控制器函数,工厂函数,服务函数与$watch回调都只是一个模板,用于取toString,真正运行的是编译后 ...

  9. PC问题-可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹?

    问题现象:可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹? 问题原因:目标主机中NetLogon服务未启动. 问题处理:远程打开目标主机,“我的电脑-管理-服务-启动(改为自动) ...

  10. PLSQL Developer 常用设置及快捷键

    1.登录后自动选中My Objects(已验证可用) 默认情况下,PLSQL Developer登录后,Brower里会选择all Objects,如果你登录的用户是DBA, 要展开tables目录, ...