图片存储到数据库中,通过Servlet+jsp进行图片的存储及展示

因项目需要,图片类型的文件无法存储到本地磁盘中,必须以二进制的格式存储到数据库中。以这样的方式进行读写操作时候,就遇到各种问题,下面分别进行问题展示,并列出解决方案:
问题一、图片在数据库中的格式问题:
看了众多的参考资料,最终以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 getAllSenInfo() {
        String sql = "select * from senInfo";
        try {
            return qr.query(sql, new BeanListHandler(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.class), id);

        } catch (Exception e) {
            LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString());
            throw new RuntimeException(e);
        }
    }

问题三、前端JSP页面在进行展示的时候出现的格式转换问题:
jsp页面显示总不能显示出该图片的对象类,必须多对象类进行操作,我采用的方法是将图片调用该类的Servlet链接,通过ID调用图片的,Servlet里通过对图片流进行处理,将二进制流转换为图片。
页面中使用c:forEach循环,如下:

forEach items="${requestScope.senInfoList}" var="senInfoList">
            
  • ${senInfoList.imageName },${ senInfoList.senText}, "250px" height="400px" src="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showImage&imageId=${senInfoList.id}"/>
  • 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();  
                }
            }  
        }

    代码如上所示,不需要过多解释,有基础的肯定能看懂。没基础的可以联系我,具体问题具体分析。
    代码仅供参考!

    你可能感兴趣的:(----Java)