图片存储到数据库中,通过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<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();  
            }
        }  
    }

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

猜你喜欢

转载自blog.csdn.net/jsqfengbao/article/details/78791618
今日推荐