• javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)


    原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000

    将多个文件压缩并下载下来:(绿色为修改原博客的位置)

    注意:需要使用<a>标签来调用此方法,ajax不管用无法弹出选择下载位置的弹窗

    @RequestMapping("/uploads")
        public void recursion(String root, Vector<java.io.File> vecFile,HttpServletResponse response,HttpServletRequest request) throws IOException{
            //根据路径生成一个文件
            root = "d:\upload\A-1-1-\0001\001\001";
            java.io.File file = new java.io.File(root);
            java.io.File[] subFile = file.listFiles();
            //遍历文件里面的所有文件
            for (int i = 0; i < subFile.length; i++) {
                /*如果是文件夹,则递归下去寻找文件夹里面的文件*/
                if (subFile[i].isDirectory()) {
                    //recursion(subFile[i].getAbsolutePath(), vecFile);
                } else {
                //如果不是文件夹的话就直接添加到vector容器里面去
                //将遍历出来的文件进行压缩和下载:
    //            String filename = subFile[i].getName();
    //            vecFile.add(filename);
                    vecFile.add(subFile[i]);
                }
            }
            //设置下载文件的名称
            String fileName = "temp1.zip";
            response.setContentType("text/html; charset=UTF-8"); // 设置编码字符
            response.setContentType("application/x-msdownload"); // 设置内容类型为下载类型
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 设置下载的文件名称
            OutputStream out = response.getOutputStream(); // 创建页面返回方式为输出流,会自动弹出下载框
            //创建压缩文件需要的空的zip包
            String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/");
            /* 输出basePath的路径,方便调试 */
            System.out.println(zipBasePath);
            /* 创建压缩文件需要的空的zip包 ,这里是自动生成的,不用我们自己去生成 */
            String zipFilePath = zipBasePath + "temp.zip";
            System.out.println("create the empty zip file successfully??????");
            //根据临时的zip压缩包路径,创建zip文件
            java.io.File zip = new java.io.File(zipFilePath);
            if (!zip.exists()) {
                zip.createNewFile();
            }
            System.out.println("create the  zip file successfully");
            // 创建zip文件输出流
            FileOutputStream fos = new FileOutputStream(zip);
            ZipOutputStream zos = new ZipOutputStream(fos);
            System.out.println("create the empty zip stream successfully");
            //循环读取文件路径集合,获取每一个文件的路径(将文件一个一个进行压缩)
            for (java.io.File fp : vecFile) {
                zipFile(fp, zos); // 将每一个文件写入zip文件包内,即进行打包
            }
            System.out.println("get the path successfully");
            // fos.close();//如果这样关两次的话会报错,java.io.IOException: Stream closed
            zos.close();
            System.out.println("ok??");
            //将打包后的文件写到客户端,使用缓冲流输出
            InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath));
            byte[] buff = new byte[4096];
            int size = 0;
            while ((size = fis.read(buff)) != -1) {
                out.write(buff, 0, size);
            }
            System.out.println("package is packed successfully");
            //释放和关闭输入输出流
            out.flush();//清楚缓存
            out.close();
            fis.close();
    
        }
    
        /**
         * 文件压缩的方法
         * @param inputFile
         * @param zipoutputStream
         */
        public void zipFile(java.io.File inputFile, ZipOutputStream zipoutputStream) {
            try {
                if (inputFile.exists()) { // 判断文件是否存在
                    if (inputFile.isFile()) { // 判断是否属于文件,还是文件夹
    
                        // 创建输入流读取文件
                        FileInputStream fis = new FileInputStream(inputFile);
                        BufferedInputStream bis = new BufferedInputStream(fis);
    
                        // 将文件写入zip内,即将文件进行打包
                        ZipEntry ze = new ZipEntry(inputFile.getName()); // 获取文件名
                        zipoutputStream.putNextEntry(ze);
    
                        // 写入文件的方法,同上
                        byte[] b = new byte[1024];
                        long l = 0;
                        while (l < inputFile.length()) {
                            int j = bis.read(b, 0, 1024);
                            l += j;
                            zipoutputStream.write(b, 0, j);
                        }
                        // 关闭输入输出流
                        bis.close();
                        fis.close();
                    } else { // 如果是文件夹,则使用穷举的方法获取文件,写入zip
                        try {
                            java.io.File[] files = inputFile.listFiles();
                            for (int i = 0; i < files.length; i++) {
                                zipFile(files[i], zipoutputStream);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    对于单个文件下载:

    可以参考:https://blog.csdn.net/alan_liuyue/article/details/72772502

    参考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面关于流的关闭有点瑕疵)

  • 相关阅读:
    Myeclipse 安装svn插件
    Http状态码详解
    myeclipse中的js文件报错
    eclipse 反编译插件安装
    ecshop绕过验证码暴力破解
    Myeclipse中全部文件设置成UTF-8
    WampServer phpadmin apache You don't have permission to access
    如何在Win8系统上建立WIFI热点
    记录远程桌面登录者的IP和MAC
    数据库总结
  • 原文地址:https://www.cnblogs.com/ytsbk/p/10531946.html
Copyright © 2020-2023  润新知