手把手教你用SpringBoot将文件打包成zip存放或导出


Posted in Java/Android onJune 11, 2021

环境准备

其实也没什么准备,准备好Springboot就行,还有几张图片:

手把手教你用SpringBoot将文件打包成zip存放或导出

将文件打包成Zip存放

代码

Controller代码:

@RequestMapping("/zip")
@RestController
public class ZipController {

    /**
     * 将文件打包成zip并存放在特定位置
     */
    @PostMapping("package")
    public void packageFileToZip() throws IOException {
        // 为了方便我直接将文件地址写好了,各位可以根据自己的情况修改
        String[] filePath = new String[]{"E:\\ykds\\1068128498917799516.jpg", "E:\\ykds\\1068128498917917980.jpg", "E:\\ykds\\1068128498917807874.jpg"};
        // 将需要打包的文件都放在一个集合中
        List<File> fileList = new ArrayList<>();
        for (String s : filePath) {
            File file = new File(s);
            fileList.add(file);
        }
        // 先在D盘创建一个压缩包
        File zipFile = new File("D:\\package.zip");
        if(!zipFile.exists())
            zipFile.createNewFile();
        // 将package.zip的File对象传到toZip对象中
        ZipUtils.toZip(fileList, zipFile);
    }
}

ZipUTils工具类代码

public class ZipUtils {

    /**
     * 把文件集合打成zip压缩包
     * @param srcFiles 压缩文件集合
     * @param zipFile  zip文件名
     * @throws RuntimeException 异常
     */
    public static void toZip(List<File> srcFiles, File zipFile) throws IOException {
        if(zipFile == null){
            return;
        }
        if(!zipFile.getName().endsWith(".zip")){
            return;
        }
        ZipOutputStream zos = null;
        FileOutputStream out = new FileOutputStream(zipFile);
        try {
            zos = new ZipOutputStream(out);
            for (File srcFile : srcFiles) {
                byte[] buf = new byte[BUFFER_SIZE];
                zos.putNextEntry(new ZipEntry(srcFile.getName()));
                int len;
                // 读取文件并写入到zip中
                FileInputStream in = new FileInputStream(srcFile);
                while ((len = in.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                    zos.flush();
                }
                in.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (zos != null) {
                zos.close();
            }
        }
    }
}

测试

代码打好了,接下来测试下,打开熟悉的postman:

手把手教你用SpringBoot将文件打包成zip存放或导出

调用接口后就会在D盘中新建一个package.zip的压缩包:

手把手教你用SpringBoot将文件打包成zip存放或导出

可以看到,我打包的文件都在这里,再看看能不能正常显示:

手把手教你用SpringBoot将文件打包成zip存放或导出

very good!

将文件打包成zip并导出

上面的方法只是将压缩包保存在本地,如果需要导出的话代码有点不一样。

代码

Controller代码:

/**
     * 将文件打包成zip并下载
     */
    @PostMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里还是和上面一样
        String[] filePath = new String[]{"E:\\ykds\\1068128498917799516.jpg", "E:\\ykds\\1068128498917917980.jpg", "E:\\ykds\\1068128498917807874.jpg"};
        List<File> fileList = new ArrayList<>();
        for (String s : filePath) {
            File file = new File(s);
            fileList.add(file);
        }
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=download.zip");
        ZipUtils.downloadZip(response.getOutputStream(), fileList);
    }

ZipUtils工具类代码

public static void downloadZip(OutputStream outputStream, List<File> fileList){
        BufferedInputStream bufferedInputStream = null;
        ZipOutputStream zipOutputStream = null;
        try {
            zipOutputStream = new ZipOutputStream(outputStream);
            for (File file : fileList) {
                ZipEntry zipEntry = new ZipEntry(file.getName());
                zipOutputStream.putNextEntry(zipEntry);
                byte[] buf = new byte[BUFFER_SIZE];
                int len;
                FileInputStream in = new FileInputStream(file);
                while ((len = in.read(buf)) != -1) {
                    zipOutputStream.write(buf, 0, len);
                    zipOutputStream.flush();
                }
            }
            zipOutputStream.flush();
            zipOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            try {
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
                if (zipOutputStream != null ) {
                    zipOutputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

测试

还是用postman:

手把手教你用SpringBoot将文件打包成zip存放或导出
手把手教你用SpringBoot将文件打包成zip存放或导出

下载完成后打开看看

手把手教你用SpringBoot将文件打包成zip存放或导出

到此这篇关于手把手教你用SpringBoot将文件打包成zip存放或导出的文章就介绍到这了,更多相关SpringBoot将文件打包成zip内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
Java设计模式中的命令模式
Apr 28 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
springboot @ConfigurationProperties和@PropertySource的区别
教你用Java Swing实现自助取款机系统
总结一些Java常用的加密算法
Jun 11 #Java/Android
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 #Java/Android
源码解读Spring-Integration执行过程
浅谈Java实现分布式事务的三种方案
分享一些Java的常用工具
You might like
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
php unlink()函数使用教程
2018/07/12 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
值传递还是引用传递
2015/02/08 面试题
项目开发计划书
2014/01/09 职场文书
中学生获奖感言
2014/02/04 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
安全责任书怎么写
2014/07/28 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
项目转让协议书
2014/10/27 职场文书
植树节新闻稿
2015/07/17 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python