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(里面关于流的关闭有点瑕疵)

posted on 2019-03-14 17:59  ★【金字塔】☆  阅读(3337)  评论(0编辑  收藏  举报