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请求即可

  • 相关阅读:
    UICollectionView添加 HeaderView FooterView
    Swift-UIDynamic初见
    Swift归档
    通知NSNotication&通知中心NSNoticationCenter
    iOS沙盒
    lldb-320.4.152﹣Debugger commands:
    UIPickerView採摘控件的學習
    hive的优化
    zookeeper简易配置及hadoop高可用安装
    hadoop组件概念理解
  • 原文地址:https://www.cnblogs.com/aeolian/p/7714662.html
Copyright © 2011-2022 走看看