java实现文件打包压缩输出到浏览器下载

 更新时间:2021年11月17日 09:53:51   作者:Java大表哥  
这篇文章主要介绍了java实现文件打包压缩输出到浏览器下载,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

文件打包压缩输出到浏览器下载

java批量下载文件打包压缩工具类,输出到浏览器下载,可以自己改名。

一、工具类:

入参 :文件LIst ;打包后的名字 ;响应到浏览器

/**
     * 功能:压缩多个文件,输出压缩后的zip文件流
     *
     * @param srcfile:源文件列表
     * @param zipFileName:压缩后的文件名
     * @param response:           Http响应
     */
    public void zipFiles(List<File> srcfile, String zipFileName, HttpServletResponse response) throws IOException {
        byte[] buf = new byte[1024];
        // 获取输出流
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileInputStream in = null;
        ZipOutputStream out = null;
        try {
            response.reset(); // 重点突出
            // 不同类型的文件对应不同的MIME类型
            response.setContentType("application/x-msdownload");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + zipFileName + ".zip");
 
            // ZipOutputStream类:完成文件或文件夹的压缩
            out = new ZipOutputStream(bos);
            for (int i = 0; i < srcfile.size(); i++) {
                in = new FileInputStream(srcfile.get(i));
                // 给列表中的文件单独命名
                out.putNextEntry(new ZipEntry(srcfile.get(i).getName()));
                int len = -1;
                while ((len = in.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
            }
            out.close();
            bos.close();
            log.info("压缩完成.");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) in.close();
            if (out != null) out.close();
        }
    }

二、调用

zipFiles(files, zipName, response);

生成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();
            }
    }

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

相关文章

  • java实现MD5加密的方法小结

    java实现MD5加密的方法小结

    这篇文章主要介绍了java实现MD5加密的方法,结合具体实例形式总结分析了java实现md5加密的常用操作技巧与使用方法,需要的朋友可以参考下
    2017-10-10
  • spring data jpa分页查询示例代码

    spring data jpa分页查询示例代码

    本篇文章主要介绍了spring data jpa分页查询示例代码,分页在很多项目中都能使用,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • 浅析java双向冒泡排序算法

    浅析java双向冒泡排序算法

    这篇文章主要介绍了浅析java双向冒泡排序算法,并附上源码,需要的朋友可以参考下
    2015-02-02
  • Java Code Cache满导致应用性能降低问题解决

    Java Code Cache满导致应用性能降低问题解决

    这篇文章主要介绍了Java Code Cache满导致应用性能降低问题解决,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot2.7.14整合redis7的详细过程

    SpringBoot2.7.14整合redis7的详细过程

    这篇文章主要介绍了SpringBoot2.7.14整合redis7的详细过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • Java8的Optional如何干掉空指针(示例详解)

    Java8的Optional如何干掉空指针(示例详解)

    这篇文章主要介绍了Java8的Optional如何干掉空指针,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 利用Spring Boot创建docker image的完整步骤

    利用Spring Boot创建docker image的完整步骤

    这篇文章主要给大家介绍了关于如何利用Spring Boot创建docker image的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java通过Fork/Join优化并行计算

    Java通过Fork/Join优化并行计算

    这篇文章主要为大家详细介绍了Java通过Fork、Join来优化并行计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringDataMongoDB多文档事务的实现

    SpringDataMongoDB多文档事务的实现

    mongodb4.0也出来一段时间了,这个版本最为大众期待的特性就是支持了多文档事务。这篇文章主要介绍了SpringDataMongoDB多文档事务的实现,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    Spring容器的创建过程之如何注册BeanPostProcessor详解

    关于BeanPostProcessor 各位一定不陌生,今天整理的这篇文章总结了如何注册BeanPostProcessor,文中有非常详细的图文示例,需要的朋友可以参考下
    2021-06-06

最新评论