zoukankan      html  css  js  c++  java
  • 打包zip下载

    //首先引入的文件为org.apache的切记不是jdk的
    import org.apache.tools.zip.ZipOutputStream;
    import org.apache.tools.zip.ZipEntry;

    zip压缩要用到包apache-ant-zip-2.3.jar

    下载地址http://www.java2s.com/Code/Jar/a/Downloadapacheant171jar.htm

         /**
         * 将文件打包下载
         * @param path  路径
         * @param request 
         * @param response
         * @throws IOException
         * @throws InstantiationException
         * @throws IllegalAccessException
         * @throws IllegalArgumentException
         * @throws InvocationTargetException
         * @throws NoSuchMethodException
         * @throws SecurityException
         */
        @RequestMapping(value="/getZipByPath",method={RequestMethod.GET, RequestMethod.POST})
        public void getZipByPath(String path,HttpServletRequest request,HttpServletResponse response) throws IOException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
            logger.info("-> getZipByPath()");
            ByteArrayOutputStream byteos = new ByteArrayOutputStream();   //将压缩文件暂存到此流中
            ZipOutputStream out = new ZipOutputStream(byteos);    //封装字节流
            out.setEncoding("gbk");    //解决文件名乱码问题
            BufferedOutputStream bos = new BufferedOutputStream(out);    //创建缓冲输出流
            path = request.getServletContext().getRealPath("declare_attached"+File.separator+path);    //根据webroot下面文件路径得到绝对路径
            File sourceFile = new File(path);    //源文件(文件或文件夹)
            if (sourceFile==null) {
                logger.info("-> "+path+"文件已不存在");
                return;
            }
            service.getZipByPath(out,bos,sourceFile,sourceFile.getName());
            //bos.close();    //关闭这个会报流被关闭的错误,不知道为啥
            out.close();    
            byteos.close();
            //输出
            response.reset();
            response.setContentType("application/zip; charset=utf-8");    //告诉浏览器是zip格式,字节编码为utf-8
            response.setHeader("Content-Disposition","attachment;Filename="+sourceFile.getName()+CommonTool.getNowDateStr3()+".zip");   //附件名
            byteos.writeTo(response.getOutputStream());    //把字节流里面的东西写到response的输出流里面去
            response.getOutputStream().flush();    
        }

    方法

         /**
         * 打包zip下载
         * @param out
         * @param bos
         * @param sourceFile 源文件
         * @param base 文件名
         * @throws IOException
         */
        @Transactional(propagation = Propagation.NOT_SUPPORTED, isolation = Isolation.DEFAULT)
        public void getZipByPath(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws IOException{
            //如果路径为目录(文件夹)
            if(sourceFile.isDirectory())
            {
                //取出文件夹中的文件(或子文件夹)
                File[] flist = sourceFile.listFiles();
                if(flist.length==0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
                {
                    out.putNextEntry(  new ZipEntry(base+"/") );//只要有文件就可以,文件夹没有内容
                }
                else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
                {
                    for(int i=0;i<flist.length;i++)
                    {
                        getZipByPath(out,bos,flist[i],base+"/"+flist[i].getName());
                    }
                }
            }
            else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
            {
                out.putNextEntry( new ZipEntry(base) );   //生成文件,但是无内容!!!
                //读取目标文件,将文件写入到指定文件中
                FileInputStream fos = new FileInputStream(sourceFile);
                BufferedInputStream bis = new BufferedInputStream(fos);
                byte[] tag = new byte[1024];
                //将源文件写入到zip文件中
                int len;
                while((len=bis.read(tag))!=-1)
                {
                    bos.write(tag,0,len);
                }
                bos.flush();    //这句一定要写,不然得等到1024byte才会输出,这样会造成上一个文件的流输出到下一个文件里面
                bis.close();
                fos.close();
            }
        }

    然后前端用a的href请求即可

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/aeolian/p/7714662.html
Copyright © 2011-2022 走看看