打包下载某个文件夹下的所有文件

该博客介绍了一种使用Java实现文件夹压缩并提供下载的方法。通过`ZipUtil`工具类进行文件或文件夹的压缩,然后在Controller层设置响应头,将压缩后的ZIP文件作为HTTP响应输出,供用户下载。虽然这个方法适用于一级目录的压缩,但不适用于多级目录的递归压缩。
摘要由CSDN通过智能技术生成

把某个文件夹下面的所有东西都打包并输出

controller

 @RequestMapping("/downloadFile")
    public void downloadFile(HttpServletResponse response) throws Exception {
        zjtsProgramUpgradeRestService.downloadFile(response);
    }

service

public void downloadFile(HttpServletResponse response) throws IOException {
        //配置文件中获取
        String basePath = PRAGRAME_BASE_TEMPLATE_PATH;

        String downloadPath = basePath + File.separator + "下载产品配置信息获取引导手册.zip";
        ZipUtil.compress(downloadPath, getFilePaths(basePath));
        InputStream inputStream = null;
        File zipFile = null;
        try {
            zipFile = new File(downloadPath);
            inputStream = new FileInputStream(zipFile);
            //把文件流写入客户端进行响应
            response.setContentType("application/zip");
            response.setHeader("Content-Length", String.valueOf(zipFile.length()));
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(downloadPath, "UTF-8"))));
            readAndWrite(inputStream, response);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (zipFile != null) {
                zipFile.delete();
            }
        }
    }

/**
     * 读写文件
     *
     * @param inputStream
     * @param response
     * @throws Exception
     */
    private static void readAndWrite(InputStream inputStream, HttpServletResponse response) throws Exception {
        OutputStream os = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int i = inputStream.read(buffer);
        while (i != -1) {
            os.write(buffer, 0, i);
            i = inputStream.read(buffer);
        }
    }
 * 压缩文件工具类
package cn.com.goldwind.ercp.fas.util;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩文件工具类
 * @author wyf
 * 2016年8月14日
 */
public class ZipUtil {
    static final int BUFFER = 8192;

    private static File zipFile;

    /**
     * 压缩单个或多文件方法
     * @param zipPath 压缩后的文件路径
     * @param srcPathName 要压缩的文件路径
     * 参数srcPathName也可以定义成数组形式,需调用方把参数封装到数组中传过来即可
     */
    public static void compress(String zipPath,String... srcPathName) {
        //压缩后的文件对象
        zipFile = new File(zipPath);
        try {
            //创建写出流操作
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());
            ZipOutputStream out = new ZipOutputStream(cos);
            for(String srcPath:srcPathName){
                //创建需要压缩的文件对象
                File file = new File(srcPath);
                if (!file.exists()){
                    throw new RuntimeException(srcPath + "不存在!");
                }
                /*
                 * (1)如果在zip压缩文件中不需要一级文件目录,定义String basedir = "";
                 * 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;
                 * (2)如果只是想在压缩后的zip文件里包含一级文件目录,不包含二级以下目录,
                 * 直接在这定义String basedir = file.getName() + File.separator;
                 * 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;
                 * (3)如果想压缩后的zip文件里包含一级文件目录,也包含二级以下目录,即zip文件里的目录结构和原文件一样
                 * 在此定义String basedir = "";
                 * 下面的compress方法中当判断文件file是目录后需要加上basedir = basedir + file.getName() + File.separator;
                 */
                //String basedir = file.getName() + File.separator;
                String basedir = "";
                compress(file, out, basedir);
            }
            out.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private static void compress(File file, ZipOutputStream out, String basedir) {
        /*
         * 判断是目录还是文件
         */
        if (file.isDirectory()) {
            basedir += file.getName() + File.separator;
            compressDirectory(file, out, basedir);
        } else {
            System.out.println("压缩:" + basedir + file.getName());
            compressFile(file, out, basedir);
        }
    }

    /**
     * 压缩一个目录
     */
    private static void compressDirectory(File dir, ZipOutputStream out, String basedir) {
        if (!dir.exists()){
            return;
        }
        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            /* 递归 */
            compress(files[i], out, basedir);
        }
    }

    /**
     * 压缩一个文件
     */
    private static void compressFile(File file, ZipOutputStream out, String basedir) {
        if (!file.exists()) {
            return;
        }
        try {
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            //创建Zip实体,并添加进压缩包
            ZipEntry entry = new ZipEntry(basedir + file.getName());
            out.putNextEntry(entry);
            //读取待压缩的文件并写进压缩包里
            int count;
            byte data[] = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
            bis.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 解压缩
     * @param sourceFile 要解压缩的文件的路径
     * @param destDir 解压缩后的目录路径
     * @throws Exception
     */
    public static void deCompress(String sourceFile,String destDir) throws Exception{
        //创建需要解压缩的文件对象
        File file = new File(sourceFile);
        if (!file.exists()){
            throw new RuntimeException(sourceFile + "不存在!");
        }
        //创建解压缩的文件目录对象
        File destDiretory  = new File(destDir);
        if(!destDiretory.exists()){
            destDiretory.mkdirs();
        }
    	/*
         * 保证文件夹路径最后是"/"或者"\"
         * charAt()返回指定索引位置的char值
         */
        char lastChar = destDir.charAt(destDir.length()-1);
        if(lastChar!='/'&&lastChar!='\\'){
            //在最后加上分隔符
            destDir += File.separator;
        }
        unzip(sourceFile, destDir);
    }

    /**
     * 解压方法
     * 需要ant.jar
     */
    private static void unzip(String sourceZip,String destDir) throws Exception{
        try{
            Project p = new Project();
            Expand e = new Expand();
            e.setProject(p);
            e.setSrc(new File(sourceZip));
            e.setOverwrite(false);
            e.setDest(new File(destDir));
            e.execute();
        }catch(Exception e){
            throw e;
        }
    }

}

总结:压缩文件的那个可以单独当成一个工具类来使用,这只是下载文件的一种实现方式,适合一级目录 如果文件夹下面还有文件夹就不适用了 需要用递归来实现 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值