zoukankan      html  css  js  c++  java
  • SpringMVC处理MySQL BLOB字段的下载

    任务:

    uos.docfile的content字段是longblob类型,通过Web点击链接能下载到存储在这个字段里的文件。Web点击链接类似如下形式:

    http://localhost:8080/dld/downloadDocument.html?id=81&&filename=jfreechart-1.0.19.zip

    1.控制器代码:

        @RequestMapping("/downloadDocument")
        public ModelAndView downloadDocument(HttpServletRequest request,HttpServletResponse response){
            try {
                // 取参数
                String id=request.getParameter("id");
                String filename=request.getParameter("filename");
                
                // 设置Resposne
                response.reset();
                response.setHeader("Content-disposition", "attachment; filename="+filename);
                response.setContentType("text/x-plain");
            
                // 获得输出流
                ServletOutputStream out = response.getOutputStream();
    
                // 从数据库拷贝输出流
                ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(4096);
                service.copyDocumentOutputStream(id, byteOutputStream);
                logger.info(" call PosService.copyDocumentOutputStream successfully.");
                
                // 转化
                byte[] bt = null;
                bt = byteOutputStream.toByteArray();               
                
                // 向客户端写输出
                out.write(bt);
                out.flush();
                out.close();
                
                return null;
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(e);
                
                request.setAttribute("error", e.getClass());
                request.setAttribute("reason", e.getMessage());
                StackTraceElement[] arr=e.getStackTrace();
                request.setAttribute("stackTraceElements", arr);
                
                return new ModelAndView("pages/error/index.jsp");
            }
        }

    2.Service中代码,同样这里也只是中转

    public void copyDocumentOutputStream(final String id, final OutputStream os) throws Exception{
            getPosDao().copyDocumentOutputStream(id, os);
        }

    3.DAO中代码,这里是实质代码

        public void copyDocumentOutputStream(final String id, final OutputStream os) throws Exception{
            final LobHandler lobHandler=new DefaultLobHandler();
            
            this.getJdbcTemplate().query("select content from uos.docfile where id=?",new String[] {id},new AbstractLobStreamingResultSetExtractor(){
                protected void streamData(ResultSet rs) throws SQLException,IOException,DataAccessException{
                    FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs,1),os);
                }
            });
        }
  • 相关阅读:
    Unity3D屠龙战机项目总结
    10.2 MySQL数据库安装
    10.1 JDBC基础
    9.5 异常处理规则
    9.4 Java的异常跟踪栈
    9.3 使用throw抛出异常
    9.2 Checked异常和Runtime异常
    9.1 异常处理机制
    8.5 泛型和数组
    8.5 擦除和转换
  • 原文地址:https://www.cnblogs.com/heyang78/p/4168891.html
Copyright © 2011-2022 走看看