手把手教你用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 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
java调用Restful接口的三种方法
Aug 23 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Java中生成微信小程序太阳码的实现方案
Jun 01 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 采集程序原理分析篇
2010/03/05 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
php查询ip所在地的方法
2014/12/05 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
JavaScript 特殊字符
2007/04/05 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python写入数据到MP3文件中的方法
2015/07/10 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python绘制直线的方法
2018/06/30 Python
Python字典的核心底层原理讲解
2019/01/24 Python
Python @property使用方法解析
2019/09/17 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
python创建n行m列数组示例
2019/12/02 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
Python实现结构体代码实例
2020/02/10 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
安全生产知识竞赛活动总结
2014/07/07 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
Go语言入门exec的基本使用
2022/05/20 Golang