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);
                }
            });
        }
  • 相关阅读:
    JDK的KEYTOOL的应用,以及签署文件的应用(原创)
    2017年Android SDK下载安装及配置教程(附带原文地址)
    C# 使用 MemoryStream 将数据写入内存
    iOS7下隐藏status bar的详细研究
    如何布局包含Image和Title的UIButton
    自定义iOS7导航栏背景,标题和返回按钮文字颜色
    UIRefreshControl自动刷新
    SDWebImage缓存图片的机制(转)
    iOS6的旋屏控制技巧
    IOS开发之----NSDictionary,JSON和XML互相转换
  • 原文地址:https://www.cnblogs.com/heyang78/p/4168891.html
Copyright © 2011-2022 走看看