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

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

相关文章

  • mybatis设置sql执行时间超时时间的方法

    mybatis设置sql执行时间超时时间的方法

    本文主要介绍了mybatis设置sql执行时间超时时间的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Netty的Handler链调用机制及如何组织详解

    Netty的Handler链调用机制及如何组织详解

    这篇文章主要为大家介绍了Netty的Handler链调用机制及如何组织示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • java调用c程序通信示例代码

    java调用c程序通信示例代码

    这篇文章主要介绍了java调用c程序通信示例,大家参考使用吧
    2013-12-12
  • Spring Boot整合Lombok的方法详解

    Spring Boot整合Lombok的方法详解

    Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。这篇文章主要介绍了Spring Boot整合Lombok,需要的朋友可以参考下
    2021-04-04
  • SpringAOP+RabbitMQ+WebSocket实战详解

    SpringAOP+RabbitMQ+WebSocket实战详解

    这篇文章主要介绍了SpringAOP+RabbitMQ+WebSocket实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java8新特性之StampedLock_动力节点Java学院整理

    Java8新特性之StampedLock_动力节点Java学院整理

    本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧
    2017-06-06
  • Java单例模式的6种实现方式详解

    Java单例模式的6种实现方式详解

    这篇文章主要介绍了Java单例模式的6种实现方式的相关资料,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • @Scheduled fixedDelayString 加载properties配置方式

    @Scheduled fixedDelayString 加载properties配置方式

    这篇文章主要介绍了@Scheduled fixedDelayString 加载properties配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 9种Java单例模式详解(推荐)

    9种Java单例模式详解(推荐)

    这篇文章主要介绍了9种Java单例模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 基于Hadoop实现Knn算法

    基于Hadoop实现Knn算法

    这篇文章主要为大家详细 介绍了基于Hadoop实现Knn算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12

最新评论