文档章节

Java实现批量下载文件

LIST丶ONE
 LIST丶ONE
发布于 2016/08/10 15:54
字数 778
阅读 95
收藏 0

   //action

 public String exportFile1() {
        // TODO Auto-generated method stub
        HttpServletResponse response= ServletActionContext.getResponse();
        HttpServletRequest request = ServletActionContext.getRequest();
        String id = request.getParameter("id");
        String filename = request.getParameter("filename");
        String[] idArr = id.split(",");
        String[] filenameArr = filename.split(",");
        System.out.println(id+"-----"+ filename.replace(" ", ""));
        String filePath = Configration.getApplicationRootPath()+Configration.getProperty("file_PATH") + File.separator+"fileuplod";
        // windows
//        String zipPath = filePath+ "\\"+"zipdata.zip";
        //linux
        String zipPath = filePath+ "//"+"zipdata.zip";
        
        String fileString = "";
        File[] srcfile = new File[idArr.length];
        for(int i = 0;i < idArr.length;i++){
           fileString = specialLineDao.exportFile1(idArr[i]);
           try {
               FileExpUtils.createMkdir(filePath);
               // windows
//               String filePath1 = filePath + "\\"+filenameArr[i];
               //linux
               String filePath1 = filePath + "//"+filenameArr[i];
//               FileExpUtils.createFile(filePath, FileByteUtil.getFromBASE64ToByte(fileString));
               File file = new File(filePath1);
                if (!file.exists()) {
                    file.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(FileByteUtil.getFromBASE64ToByte(fileString));
                fos.flush();
                fos.close();
                srcfile[i]=file;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
        //创建压缩文件
        File file1 = new File(zipPath);
        if (!file1.exists()) {
            try {
                file1.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //将文件压缩
        zipFiles(srcfile,file1);
        //下载打包的压缩包
        downloadZip(file1,response); 
        //删除目录及目录下的文件
        FileExpUtils.deleteDirectory(filePath);
        return null;
    }
    public static void zipFiles(File[] srcfile,File zipfile){
        byte[] buf=new byte[1024];
        try {
            //ZipOutputStream类:完成文件或文件夹的压缩
            ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipfile));
            for(int i=0;i<srcfile.length;i++){
                FileInputStream in=new FileInputStream(srcfile[i]);
                out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                int len;
                while((len=in.read(buf))>0){
                    out.write(buf,0,len);
                }
                out.closeEntry();
                in.close();
            }
            out.close();
            System.out.println("压缩完成.");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
       /**
        * 下载打包的文件
        * @param file
        * @param response
        */
       public void downloadZip(File file,HttpServletResponse response) {
           try {
               // 以流的形式下载文件。
               BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
               byte[] buffer = new byte[fis.available()];
               fis.read(buffer);
               fis.close();
               // 清空response
               response.reset();
       
               OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
               response.setContentType("application/octet-stream");
               response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
               toClient.write(buffer);
               toClient.flush();
               toClient.close();
               file.delete();        //将生成的服务器端文件删除
            } 
            catch (IOException ex) {
               ex.printStackTrace();
           }
       }

    /** 
     * 删除目录(文件夹)以及目录下的文件 
     * @param   sPath 被删除目录的文件路径 
     * @return  目录删除成功返回true,否则返回false 
     */  
    public static boolean deleteDirectory(String sPath) {  
        //如果sPath不以文件分隔符结尾,自动添加文件分隔符  
        if (!sPath.endsWith(File.separator)) {  
            sPath = sPath + File.separator;  
        }  
        File dirFile = new File(sPath);  
        //如果dir对应的文件不存在,或者不是一个目录,则退出  
        if (!dirFile.exists() || !dirFile.isDirectory()) {  
            return false;  
        }  
        boolean flag = true;  
        //删除文件夹下的所有文件(包括子目录)  
        File[] files = dirFile.listFiles();  
        for (int i = 0; i < files.length; i++) {  
            //删除子文件  
            if (files[i].isFile()) {  
                flag = deleteFile(files[i].getAbsolutePath());  
                if (!flag) break;  
            } //删除子目录  
            else {  
                flag = deleteDirectory(files[i].getAbsolutePath());  
                if (!flag) break;  
            }  
        }  
        if (!flag) return false;  
        //删除当前目录  
        if (dirFile.delete()) {  
            return true;  
        } else {  
            return false;  
        }  
    }

      /**
      * 将base64字符串解码后返回字节数组
      */
     public static byte[] getFromBASE64ToByte(String s) {
      if (s == null)
       return null;
      BASE64Decoder decoder = new BASE64Decoder();
      try {
       byte[] b = decoder.decodeBuffer(s);
       return b;
      } catch (Exception e) {
       e.printStackTrace();
       return null;
      }
     }

 

//DAO

    public String exportFile1(String id) {
        // TODO Auto-generated method stub
        
        String sql = "SELECT T.ATTACHMENT FROM  LINE_FILE_TAB T WHERE T.ID = '"+id+"'";
        System.out.println("-------------============---------"+sql);
        String str = "";
        try {
            str = colbUtil.clobExport(sql, "ATTACHMENT");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return str;
    }

    public String clobExport(String exportSql,String filename) throws ClassNotFoundException, SQLException,IOException {
        // TODO Auto-generated method stub
        CLOB clob = null;
        DriverManager.registerDriver(new OracleDriver());
        Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
        PreparedStatement stmt = conn.prepareStatement(exportSql);
        ResultSet rs = stmt.executeQuery();
        String content = "";
        if (rs.next()) {
            clob = (oracle.sql.CLOB) rs.getClob(filename); // 获得CLOB字段str
            // 注释: 用 rs.getString("str")无法得到 数据 ,返回的 是 NULL;
            if(clob == null){
                return content;
            }
            content = ClobToString(clob);
        }
        stmt.close();
        conn.close();
        // 输出结果
        return content;
    }

    // 将字CLOB转成STRING类型
    public String ClobToString(CLOB clob) throws SQLException, IOException {

        String reString = "";
        Reader is = clob.getCharacterStream();// 得到流
        BufferedReader br = new BufferedReader(is);
        String s = br.readLine();
        StringBuffer sb = new StringBuffer();
        while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
            sb.append(s);
            s = br.readLine();
        }
        reString = sb.toString();
        return reString;
    }

© 著作权归作者所有

共有 人打赏支持
LIST丶ONE
粉丝 0
博文 16
码字总数 2778
作品 0
昌平
程序员
selenium通过批处理来自动执行JAVA文件

一、在不想打开 eclipse的情况下,如何实现批处理来自动执行JAVA文件(批处理是自动打开命令窗口执行JAVA文件) 1、下载selenium-server-standalone-2.46.0.jar 2、把selenium-server-stand...

颜丽
2017/10/31
0
0
使用UML创建模块库——第一部分(三)

MyEclipse 在线购买低至75折!火爆开抢>> 【MyEclipse最新版下载】 UML1建模文件存储在建模库中,建模可用于生成Java代码,或者可以从代码中生成模型。本教程将向您展示如何执行与建模资源库...

Miss_Hello_World
08/02
0
0
基于SpringJdbc的泛型Dao

使用的Spring是3.1版本,不是3.0版本。两者还是有区别的,其中一点就是:SimpleJdbcTemplate在3.1版本被标记为过时了,而SimpleJdbcTemplate的一些方法,被JdbcTemplate吸收了。所以,个人推荐...

moz1q1
2014/07/20
0
0
Oracle的JDBC驱动的版本你了解吗?

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多...

i33
2012/02/20
0
0
甲骨文宣布新的 Java SE 订阅模式,为企业提供更广泛支持

甲骨文公司已经改进了Java SE(标准版)的商业支持计划,由之前企业一次性支付永久许可费用加年度支持费用的模式,改为新的订阅模式,并宣布新的模式将于2018年7月开始启用。个人使用和非商业...

达尔文
06/24
0
14

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
14分钟前
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
38分钟前
1
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部