zoukankan      html  css  js  c++  java
  • 多文件打包下载

     /**
         * 下载
         * @param response
         * info 文件夹名
         * filenames  文件名们
         */
        @RequestMapping(value = "/imgdownload", method = RequestMethod.GET)
        public void imgDownload(GeneratorPojo generatorPojo, String info, HttpServletResponse response) throws Exception {
            generatorPojo.setSpecificPath("F:\generotar\jinbeijie-customer\src\main\java\com\heyi\jinbeijie\platform\");
            String filenames="";
            if(generatorPojo.getFileName() ==null || generatorPojo.getFileName() ==""){
                List<String> list =generatorService.getAllCode(generatorPojo.getFolderName(),generatorPojo.getSpecificPath());
                for(String l:list){
                    if(filenames==""){
                        filenames=l;
                    }else{
                        filenames=filenames+","+l;
                    }
                }
            }else{
                filenames=generatorPojo.getFileName();
            }
            String[] names=filenames.split(",");
            String filepath=generatorPojo.getSpecificPath()+generatorPojo.getFolderName();
            //存放--服务器上zip文件的目录
            String directory = "D:\repository\"+generatorPojo.getFolderName();
            File directoryFile=new File(directory);
            if(!directoryFile.isDirectory() && !directoryFile.exists()){
                directoryFile.mkdirs();
            }
            //设置最终输出zip文件的目录+文件名
            String zipFileName = generatorPojo.getFolderName()+".zip";
            String strZipPath = directory+"\"+zipFileName;
            ZipOutputStream zipStream = null;
            FileInputStream zipSource = null;
            BufferedInputStream bufferStream = null;
            File zipFile = new File(strZipPath);
            try{
                //构造最终压缩包的输出流
                zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
                for (int i = 0; i<names.length ;i++){
                    //解码获取真实路径与文件名
                    String realFileName = java.net.URLDecoder.decode(names[i],"UTF-8");
                    String realFilePath = java.net.URLDecoder.decode(filepath+"\"+ names[i],"UTF-8");
                    File file = new File(realFilePath);
                    //TODO:未对文件不存在时进行操作,后期优化。
                    System.out.println(realFilePath);
                    System.out.println(file);
                    if(file.exists()){
                        zipSource = new FileInputStream(file);//将需要压缩的文件格式化为输入流
                        /**
                         * 压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样这里的name就是文件名,
                         * 文件名和之前的重复就会导致文件被覆盖
                         */
                        ZipEntry zipEntry = new ZipEntry(realFileName);//在压缩目录中文件的名字
                        zipStream.putNextEntry(zipEntry);//定位该压缩条目位置,开始写入文件到压缩包中
                        bufferStream = new BufferedInputStream(zipSource, 1024 * 10);
                        int read = 0;
                        byte[] buf = new byte[1024 * 10];
                        while((read = bufferStream.read(buf, 0, 1024 * 10)) != -1)
                        {
                            zipStream.write(buf, 0, read);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭流
                try {
                    if(null != bufferStream)
                    {bufferStream.close();}
                    if(null != zipStream){
                        zipStream.flush();
                        zipStream.close();
                    }
                    if(null != zipSource)
                    {zipSource.close();}
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //判断系统压缩文件是否存在:true-把该压缩文件通过流输出给客户端后删除该压缩文件  false-未处理
            if(zipFile.exists()){
                downImg(response,zipFileName,strZipPath);
                zipFile.delete();
            }
        }
    
    
    
    
    
        public void downImg(HttpServletResponse response,String filename,String path ) {
            if (filename != null) {
                FileInputStream is = null;
                BufferedInputStream bs = null;
                OutputStream os = null;
                try {
                    File file = new File(path);
                    if (file.exists()) {
                        //设置Headers
                        response.setHeader("Content-Type", "application/octet-stream");
                        //设置下载的文件的名称-该方式已解决中文乱码问题
                        response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1"));
                        is = new FileInputStream(file);
                        bs = new BufferedInputStream(is);
                        os = response.getOutputStream();
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while ((len = bs.read(buffer)) != -1) {
                            os.write(buffer, 0, len);
                        }
                    } else {
                        response.sendRedirect("/imgUpload/imgList?error=" + ""下载的文件资源不存在"");
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    try {
                        if (is != null) {
                            is.close();
                        }
                        if (bs != null) {
                            bs.close();
                        }
                        if (os != null) {
                            os.flush();
                            os.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

      

  • 相关阅读:
    使用init_connect记录MySQL登录日志
    MySQL 在线开启GTID的每个阶段是要做什么
    chrome控制台发送post请求
    口语练习
    adb_usb.ini在adb找不到设备时
    ubuntu 12.04硬盘分区,格式化,挂载
    编译错误处理noproguard.classeswithlocal.dex已杀死
    ubuntu 12.04(gcc降级)编译android代码遇到"_FORTIFY_SOURCE"的解决方法
    ubuntu在update的时候报错GPL ERROR
    工作站环境搭建
  • 原文地址:https://www.cnblogs.com/gaofangquan/p/11101761.html
Copyright © 2011-2022 走看看