因项目需要,图片类型的文件无法存储到本地磁盘中,必须以二进制的格式存储到数据库中。以这样的方式进行读写操作时候,就遇到各种问题,下面分别进行问题展示,并列出解决方案:
问题一、图片在数据库中的格式问题:
看了众多的参考资料,最终以longblob的格式存储图片,我采用的数据库是mysql数据库,下面展示图片的存储操作:
select * from sensitiveInfo.senInfo CREATE TABLE `senInfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imageName` varchar(45) DEFAULT NULL,
`senText` varchar(200) DEFAULT NULL,
`image` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4;
问题二、图片的读写操作:
图片以blob进行读写的时候,会出现格式转换问题,尤其是需要对Blob格式进行处理的操作。
我是以DBUtils下面的QueryRunner进行的数据库读写,此工具很简单,大家可以百度下怎么使用,
QueryRunner qr = DBUtils.getQueryRunner();
@Override
public List<SenInfo> getAllSenInfo() {
String sql = "select * from senInfo";
try {
return qr.query(sql, new BeanListHandler<SenInfo>(SenInfo.class));
}catch(Exception e) {
LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString());
}
return null;
}
@Override
public SenInfo getSenInfo(int id) {
String sql = "select * from senInfo where id = ?";
try {
return qr.query(sql, new BeanHandler<SenInfo>(SenInfo.class), id);
} catch (Exception e) {
LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString());
throw new RuntimeException(e);
}
}
问题三、前端JSP页面在进行展示的时候出现的格式转换问题:
jsp页面显示总不能显示出该图片的对象类,必须多对象类进行操作,我采用的方法是将图片调用该类的Servlet链接,通过ID调用图片的,Servlet里通过对图片流进行处理,将二进制流转换为图片。
页面中使用c:forEach循环,如下:
<c:forEach items="${requestScope.senInfoList}" var="senInfoList">
<li>${senInfoList.imageName },${ senInfoList.senText},
<img width="250px" height="400px" src="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showImage&imageId=${senInfoList.id}"/></li>
</c:forEach>
servlet里面,通过获取该类的method与ID,进行查询数据库操作:
private void showImage(HttpServletRequest request,HttpServletResponse response,String imageId) {
SenInfo senInfo= senInfoService.getSenInfo(Integer.parseInt(imageId));
if(imageId != null){
response.setContentType("image/jpeg");
try {
InputStream is = new ByteArrayInputStream(senInfo.getImage()) ;
if(is != null){
is = new BufferedInputStream(is) ;
BufferedImage bi = ImageIO.read(is) ;
OutputStream os = response.getOutputStream() ;
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os) ;
encoder.encode(bi);
os.close();
is.close();
}
} catch(IOException e){
e.printStackTrace();
}
}
}
代码如上所示,不需要过多解释,有基础的肯定能看懂。没基础的可以联系我,具体问题具体分析。
代码仅供参考!