sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1796 随笔 :: 22 文章 :: 24 评论 :: 226万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Java实现文件下载Zip压缩

目录

一、 概述

二、代码功能实现


一、 概述

开发过程中碰到一个需求,需要将服务器上的多个文件打包为zip,并进行下载响应到客户端,写了一个Demo总结分享一下,如果有错误希望大家指正!

二、代码功能实现

这里实现只是模式本地文件下载Zip,响应的客户端下载

实现思路

  1. 创建一个临时文件zip
  2. 构建一个Zip文件输出流
  3. 从服务读取文件流放入Zip文件输出流
  4. 把临时文件Zip写入OutputStream
  5. 关闭资源

1. controller

 /**
     * 下载数据包
     *
     * @param response
     * @date: 2021/3/25 15:36
     * @return: void
     */
    @GetMapping("downloadDataZip")
    public void downloadDataZip(HttpServletResponse response) {
 
        String title = "报告源数据包.zip";
        File filePath = new File(FileUtil.getTemplatePath() + File.separator + title);
        List<String> srcFiles = Arrays.asList("20210113001.jpg", "20210113003.jpg", "20210113004.jpg", "瞳孔.txt");
        FileUtil.zipFiles(srcFiles, filePath);
        String filename = System.currentTimeMillis()+"_"+title;
        //设置文件路径
        if (filePath.exists()) {
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                response.setContentType("application/octet-stream");
                response.setHeader("Content-disposition", "attachment; filename=" + new String(filename.getBytes("utf-8"), "ISO8859-1"));
                byte[] buffer = new byte[4096];
                fis = new FileInputStream(filePath);
                bis = new BufferedInputStream(fis);
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                        // 删除临时文件
                        filePath.delete();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

2. FileUtil

 
public class FileUtil {
 
 
 
    /**
     * 多图片压缩zip
     *
     * @param srcFiles 图片名称
     * @param zipFile  文件路径
     */
    public static void zipFiles(List<String> srcFiles, File zipFile) {
 
        // 判断压缩后的文件存在不,不存在则创建
        if (!zipFile.exists()) {
            try {
                zipFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream ;
        // 创建 ZipOutputStream
        ZipOutputStream zipOutputStream ;
        // 创建 FileInputStream 对象
        BufferedInputStream bis = null;
 
        FileInputStream inputStream = null;
 
        try {
            // 实例化 FileOutputStream 对象
            fileOutputStream = new FileOutputStream(zipFile);
            // 实例化 ZipOutputStream 对象
            zipOutputStream = new ZipOutputStream(fileOutputStream);
            // 创建 ZipEntry 对象
            ZipEntry zipEntry ;
            // 遍历源文件数组
            for (String file : srcFiles) {
                // 将源文件数组中的当前文件读入 FileInputStream 流中
                String fileName = file;
                String localFileDir = "D:\\file\\video";
                fileName = URLDecoder.decode(fileName, "UTF-8");
                //获取文件输入流  localFileDir是服务端存储文件的路径
                File files = new File(localFileDir + File.separator + fileName);
                inputStream = new FileInputStream(files);
                // 文件后缀名称
                // 实例化 ZipEntry 对象,源文件数组中的当前文件
                zipEntry = new ZipEntry(fileName);
                zipOutputStream.putNextEntry(zipEntry);
                // 该变量记录每次真正读的字节个数
                int len;
                // 定义每次读取的字节数组
                byte[] buffer = new byte[4096];
                while ((len = inputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, len);
                }
 
            }
            zipOutputStream.closeEntry();
            zipOutputStream.close();
 
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bis != null) {
                    bis.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 获取类路径
     * return 绝对路径地址
     */
    public static String getTemplatePath() {
        String realPath = FileUtil.class.getClassLoader().getResource("").getFile();
        File file = new File(realPath);
        realPath = file.getAbsolutePath();
        try {
            realPath = java.net.URLDecoder.decode(realPath, "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return realPath;
    }
 
}

3. 前端页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>下载功能</title>
<!--    <script th:src="@{/js/jquery-3.3.1.js}"></script>-->
    <script src="../static.js/jquery-3.3.1.js"></script>
</head>
<body>
 
<div>
    <h3>下载文件测试</h3>
    <!--    <button type="submit" id="submit">上传</button>-->
    <a href="/order/sendUploadVoice" class="tab-down-button">下载1</a>
    &nbsp; &nbsp; &nbsp;
    <a href="/order/downloadUser" class="tab-down-button">下载2</a>
    &nbsp; &nbsp; &nbsp;
    <a href="/order/downloadDataZip" class="tab-down-button">报告源数据包</a>
    <button type="button" onclick="downloadzip()">按钮下载</button>
    <!--预览图片-->
    <div class="preview_box"></div>
</div>
 
<script type="text/javascript">
 
    function downloadzip(){
        window.location.href = "/order/downloadDataZip"
    };
 
</script>
</body>
</html>

 

https://blog.csdn.net/zouliping123456/article/details/115211866
posted on   sunny123456  阅读(1523)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示