最近不小心碰见了关于数据库以二进制流存取图片的问题,以前只是在数据库中选择存放图片,所以觉得没什么问题,不过当这个问题出现时,还是头疼了一会,写出来,希望和我一样所有的新手共勉!!!
向数据库中存取图片(以二进制流的方式)
首先:存储图片
File file = new File(“地址”);//如d://ccc.jpg
FileInputStream fis = new FileInputStream(file);//得到图片的二进制流
定义sql插入语句;
连接数据库;
pstmt.setBinaryStream(3,fis,(int)file.length);
插入图片数据;
首先:存储图片
File file = new File(“地址”);//如d://ccc.jpg
FileInputStream fis = new FileInputStream(file);//得到图片的二进制流
定义sql插入语句;
连接数据库;
pstmt.setBinaryStream(3,fis,(int)file.length);
插入图片数据;
此时,图片已经以二进制流的方式存入数据库中。
=======================================================
然后:取出图片
连接数据库;
查询得到图片数据;
//这里注意顺序(这两个语句必须挨在一起执行,否则流会关闭),其实在我做这个的时候就一直是这个问题困扰着我,整整一上午啊。。。。。
InputStream in = new rs.getBinaryStream(4);
String str = encodeBase64(toByteArray(in));//将图片二进制流转化成Base64编码,这是我做的一个接口,所以图片要经过Base64加密。
然后:取出图片
连接数据库;
查询得到图片数据;
//这里注意顺序(这两个语句必须挨在一起执行,否则流会关闭),其实在我做这个的时候就一直是这个问题困扰着我,整整一上午啊。。。。。
InputStream in = new rs.getBinaryStream(4);
String str = encodeBase64(toByteArray(in));//将图片二进制流转化成Base64编码,这是我做的一个接口,所以图片要经过Base64加密。
其实我要表达的意思很简单,就是如果你要在这里读取图片的话,应该在得到流之后立刻就进行这项操作,否则流会关闭。
=======================================================
顺便带上这个函数。
这里toByteArray(InputStream in)方法是将二进制流转化成字节数组
Public Static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[73000];//72KB
Int n = 0;
While(-1 != (n = in.read(buffer))){
output.write(buffer,0,n);
}
Return output.toByteArray();
}
这里toByteArray(InputStream in)方法是将二进制流转化成字节数组
Public Static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[73000];//72KB
Int n = 0;
While(-1 != (n = in.read(buffer))){
output.write(buffer,0,n);
}
Return output.toByteArray();
}
=========================================================
encodeBase64()参数为字节数组,所以需要将二进制流转化成字节数组,再进行Base64编码
encodeBase64()参数为字节数组,所以需要将二进制流转化成字节数组,再进行Base64编码