• 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);
                }
            });
        }
  • 相关阅读:
    python
    突然萌发关于 redis 的想法(1)
    Liunx
    Git
    说一下数据库查询 和 分页问题的解决
    易忘点
    python
    python
    python
    python
  • 原文地址:https://www.cnblogs.com/heyang78/p/4168891.html
Copyright © 2020-2023  润新知