Java如何把文件夹打成压缩包并导出

目录
  • 把文件夹打成压缩包并导出
    • 1.打压缩包业务类
    • 2.调用工具类
  • 生成zip文件并导出
    • 总结一下
    • 获取下载zip文件流

把文件夹打成压缩包并导出

1.打压缩包业务类

@Controller
public class AdminController {
    private String filePath = AdminController.class.getResource("/").getPath().split("WEB-INF")[0]+ "upload/";
    @RequestMapping(value = "export_zip.htm", method = {RequestMethod.GET, RequestMethod.POST })
    public void zipwordDownAction(HttpServletRequest request,HttpServletResponse response) throws Exception {
        //打包文件的存放路径
        ZipCompressorByAnt zc = new  ZipCompressorByAnt(filePath+ "/file.zip");
        //需要打包的文件路径
        zc.compress(filePath+ "/file/");
        String contentType = "application/octet-stream";
        try {
            //导出压缩包
            download(request, response, "upload/file.zip", contentType,encodeChineseDownloadFileName(request, "file.zip"));
        } catch (Exception e) {
            request.getSession().setAttribute("msg", "暂无内容");
        }
        //如果原压缩包存在,则删除
        File file=new File(filePath+ "/file.zip");
        if(file.exists()){
            file.delete();
        }
    }
    /**
     * 下载文件
     */
    public static void download(HttpServletRequest request,HttpServletResponse response, String storeName, String contentType,String realName) throws Exception {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        String ctxPath =FileUtil.class.getResource("/").getPath().split("WEB-INF")[0];
        String downLoadPath = ctxPath + storeName;
        long fileLength = new File(downLoadPath).length();
        response.setContentType(contentType);
        response.setHeader("Content-disposition", "attachment; filename="
                + new String(realName.getBytes("utf-8"), "ISO8859-1"));
        response.setHeader("Content-Length", String.valueOf(fileLength));
        bis = new BufferedInputStream(new FileInputStream(downLoadPath));
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buff = new byte[2048];
        int bytesRead;
        while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff, 0, bytesRead);
        }
        bis.close();
        bos.close();
    }
    /**
     * 对文件流输出下载的中文文件名进行编码 屏蔽各种浏览器版本的差异性
     */
    public static String encodeChineseDownloadFileName(HttpServletRequest request, String pFileName) throws UnsupportedEncodingException {
         String filename = null;
            String agent = request.getHeader("USER-AGENT");
            if (null != agent){
                if (-1 != agent.indexOf("Firefox")) {//Firefox
                    filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(pFileName.getBytes("UTF-8"))))+ "?=";
                }else if (-1 != agent.indexOf("Chrome")) {//Chrome
                    filename = new String(pFileName.getBytes(), "ISO8859-1");
                } else {//IE7+
                    filename = java.net.URLEncoder.encode(pFileName, "UTF-8");
                    filename = StringUtils.replace(filename, "+", "%20");//替换空格
                }
            } else {
                filename = pFileName;
            }
            return filename;
    }  

2.调用工具类

import java.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
public class ZipCompressorByAnt {
    private File zipFile;
    public ZipCompressorByAnt(String pathName) {
        zipFile = new File(pathName);
    }
    public void compress(String srcPathName) {
        File srcdir = new File(srcPathName);
        if (!srcdir.exists())
            throw new RuntimeException(srcPathName + "不存在!");
        Project prj = new Project();
        Zip zip = new Zip();
        zip.setProject(prj);
        zip.setDestFile(zipFile);
        FileSet fileSet = new FileSet();
        fileSet.setProject(prj);
        fileSet.setDir(srcdir);
        //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");
        //fileSet.setExcludes(...); 排除哪些文件或文件夹
        zip.addFileset(fileSet);
        zip.execute();
    }
}

生成zip文件并导出

总结一下

关于Java下载zip文件并导出的方法,浏览器导出。

String downloadName = "下载文件名称.zip";
        downloadName = BrowserCharCodeUtils.browserCharCodeFun(request, downloadName);//下载文件名乱码问题解决
        
        //将文件进行打包下载
        try {
            OutputStream out = response.getOutputStream();
            byte[] data = createZip("/fileStorage/download");//服务器存储地址
            response.reset();
            response.setHeader("Content-Disposition","attachment;fileName="+downloadName);
            response.addHeader("Content-Length", ""+data.length);
            response.setContentType("application/octet-stream;charset=UTF-8");
            IOUtils.write(data, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

获取下载zip文件流

public byte[] createZip(String srcSource) throws Exception{
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);
        //将目标文件打包成zip导出
        File file = new File(srcSource); 
        a(zip,file,"");
        IOUtils.closeQuietly(zip);
        return outputStream.toByteArray();
    }
public void a(ZipOutputStream zip, File file, String dir) throws Exception {
            //如果当前的是文件夹,则进行进一步处理
            if (file.isDirectory()) {
                //得到文件列表信息
                File[] files = file.listFiles();
                //将文件夹添加到下一级打包目录
                zip.putNextEntry(new ZipEntry(dir + "/"));
                dir = dir.length() == 0 ? "" : dir + "/";
                //循环将文件夹中的文件打包
                for (int i = 0; i < files.length; i++) {
                    a(zip, files[i], dir + files[i].getName());         //递归处理
                }
            } else {   //当前的是文件,打包处理
                //文件输入流
               BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
               ZipEntry entry = new ZipEntry(dir);
               zip.putNextEntry(entry);
               zip.write(FileUtils.readFileToByteArray(file));
               IOUtils.closeQuietly(bis);
               zip.flush();
               zip.closeEntry();
            }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java发送https请求代码实例

    1.前文:通过webService发送https请求,有两种版本,一种是携带证书验证(比较麻烦),另外一种就是直接忽略证书,本文提供的就是第二种(本人已测试过) 2.最简易代码: import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.net.Ma

  • java开发https请求ssl不受信任问题解决方法

    本文主要讨论的是java开发https请求ssl不受信任的解决方法,具体分析及实现代码如下. 在java代码中请求https链接的时候,可能会报下面这个错误 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unab

  • 使用RestTemplate访问https实现SSL请求操作

    目录 1.添加HttpsClientRequestFactory工具类 2.修改RestTemplate 3.访问https,抛出的异常 方案一:替换jce包 方案二:升级 JDK到1.8版本(推荐方式) 方法1: 用java生成证书,不建议,移植性差. 方法2: 将RestTemplate改为https请求. 1.添加HttpsClientRequestFactory工具类 import org.springframework.http.client.SimpleClientHttpReque

  • Java如何跳过https的ssl证书验证详解

    打开我们首页,明显看到链接是https打头,https和http的通信协议差别,在于https安全性更高: http和https的差别 很明显,二者最大的区别在于https多了一个ssl证书验证,可以说https是身披SSL外壳的http.因为http存在如下缺陷: 1)通信使用明文,内容可能被窃听(重要密码泄露) 2)不验证通信方身份,有可能遭遇伪装(跨站点请求伪造) 3)无法证明报文的完整性,有可能已遭篡改(运营商劫持) 而https是利用SSL/TLS建立全信道,加密数据包.HTTPS使用

  • Java如何把文件夹打成压缩包并导出

    目录 把文件夹打成压缩包并导出 1.打压缩包业务类 2.调用工具类 生成zip文件并导出 总结一下 获取下载zip文件流 把文件夹打成压缩包并导出 1.打压缩包业务类 @Controller public class AdminController { private String filePath = AdminController.class.getResource("/").getPath().split("WEB-INF")[0]+ "upload

  • Java实现多层文件夹压缩功能

    目录 压缩文件相关技术 1.题目 2.解题思路 3.代码详解 压缩文件相关技术 1.题目 做一个多层文件夹压缩包的释放的工具. 2.解题思路 创建一个类:UnZipDirectoryFrame 使用UnZipDirectoryFrame继承JFrame构建窗体 压缩包内会有多个文件夹,每个文件夹可能会有文件夹或是文件,为了解压缩时能还原出文件夹的层次关系. 解压缩包含子文件夹的文件夹方案和解压缩全是文件的文件夹类似,区别在于如何找出包含子文件夹的文件夹的所有文件,并且构造ZipEntry时,不要

  • Java删除指定文件夹下的所有内容的方法(包括此文件夹)

    如下所示: // 删除文件夹 private static void deleteDirectory(File file) { if (file.isFile()) {// 表示该文件不是文件夹 file.delete(); } else { // 首先得到当前的路径 String[] childFilePaths = file.list(); for (String childFilePath : childFilePaths) { File childFile = new File(file

  • java简单列出文件夹下所有文件的方法

    本文实例讲述了java简单列出文件夹下所有文件的方法.分享给大家供大家参考,具体如下: import Java.io.*; public class ListFiles { private static String s = ""; private static BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); public static void main(String[] args)

  • java读取某个文件夹下的所有文件实例代码

    java读取某个文件夹下的所有文件          学习java基础知识,读取文件,读取某个文件夹,需要读取所有文件,如何实现呢,看下实例代码. 实例代码: import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class ReadFile { public ReadFile() { } /** * 读取某个文件夹下的所有文件 */ public static

  • Java的后台文件夹下文件的遍历完整代码

    一.在java中遍历一个文件夹里边的所有文件,可以有两种方式: 1.递归遍历,通常也是开发者第一时间能想到的方法,递归遍历的优点是:实现起来相对简单,代码量相对较少,执行效率较高,缺点是:比较吃内存,对硬件要求较高 // 递归遍历 private void getDirectory(File file) { File flist[] = file.listFiles(); if (flist == null || flist.length == 0) { return 0; } for (Fil

  • java实现输出文件夹下某个格式的所有文件实例代码

    package file; import java.io.File; /** * 输出某个文件夹下所有某个格式的文件 * @author hasee * */ public class Demo2 { public static void main(String[] args) { getTxtName("d:/a",".jpg"); } public static void getTxtName(String path,String suffix) { //判断文

  • Python 标准库zipfile将文件夹加入压缩包的操作方法

    zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求.大家还知道Python zipfile 库可用于压缩/解压 zip 文件. 本文介绍一下如何创建压缩包. 将 "文件" 加入压缩包 假设目录结构如下: my_project |- 唐诗三百首.txt # 这是要打包的文件 |- demo.py # 演示代码会在这里编写 |- _______ # 我们想要在这里生成一个名为 "output.zip" 的文件 "

  • Java SpringBoot集成文件之如何使用POI导出Word文档

    目录 前言 知识准备 什么是POI 实现案例 Pom依赖 导出Word 前言 通过Apache POI导出excel,而Apache POI包含是操作Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.所以也是可以通过POI来导出word的.本文主要介绍通过SpringBoot集成POI工具实现Word的导出功能. 知识准备 需要理解Apache POI遵循的标准(Office Open XML(OOXML)标准和微软的OLE 2复合文档

  • Java实现读取文件夹下(包括子目录)所有文件的文件名

    在编程的过程中,经常会用到对文件的读写操作等.比如,找出某一个文件夹下的所有文件名等. 下面的程序给出了,获取某一给定文件夹下所有文件的绝对路径的程序.可以作为某一个模块,在需要的时候直接使用. package src; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStrea

随机推荐