Springboot将多个图片导出成zip压缩包

Springboot将多个图片导出成zip压缩包

将多个图片导出成zip压缩包

/*** 判断时间差是否超过6小时* @param startTime 开始时间* @param endTime 结束时间* @return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定义日期时间格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 将字符串转换为 LocalDateTimeLocalDateTime startDateTime = LocalDateTime.parse(startTime,formatter);LocalDateTime endDateTime = LocalDateTime.parse(endTime,formatter);// 检查两个时间之间的时间差long hoursDifference = ChronoUnit.SECONDS.between(startDateTime, endDateTime);// 如果小时差小于等于6小时,则符合条件return hoursDifference <= 6 * 60 * 60;}/*** 批量下载上传的图片** @param startTime 开始时间* @param endTime   结束时间*/public void batchDownloadUploadPhoto(String startTime, String endTime,String fieldId,String unitTypeId,Integer unitNo,Integer termAddr, HttpServletResponse response, HttpServletRequest request) {if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {throw new DataValidateErrorException("请先传递时间在批量导出!");}if (!startTime.contains(":") || !endTime.contains(":")) {throw new DataValidateErrorException("请传递时分秒");}//相隔时间不得超过6小时if(!isWithin6Hours(startTime,endTime)){//大于6小时,抛出异常throw new DataValidateErrorException("导出的时间范围不得超过6小时!");}//查询导出图片urlList<ChuteImageAddress> addressList = chuteImageAddressService.selectUploadPhoto(startTime, endTime, fieldId, unitTypeId, unitNo, termAddr);//没有数据时,抛出异常if(CollectionUtils.isEmpty(addressList)){throw new DataValidateErrorException("无数据导出!");}DownloadByteArray downloadByteArray = new DownloadByteArray();// 创建临时文件File zipFile = null;FileInputStream fis = null;BufferedInputStream buff = null;ZipOutputStream zos = null;CheckedOutputStream cos = null;FileOutputStream fot = null;ServletOutputStream os = null;try {//临时文件名称zipFile = File.createTempFile("" + System.currentTimeMillis(), ".zip");fot = new FileOutputStream(zipFile);// 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)cos = new CheckedOutputStream(fot, new Adler32());// 用于将数据压缩成Zip文件格式zos = new ZipOutputStream(cos);String[] files = new String[addressList.size()];List<String> list = addressList.stream().map(ChuteImageAddress::getImgUrl).collect(Collectors.toList());list.toArray(files);for (int i = 0; i < files.length; i++) {String file = files[i];zos.putNextEntry(new ZipEntry(addressList.get(i).getImgName()));StorePath storePath = StorePath.praseFromUrl(file);byte[] fileBytes = client.downloadFile(storePath.getGroup(), storePath.getPath(), downloadByteArray);zos.write(fileBytes);}os = response.getOutputStream();//下载文件,使用spring框架中的FileCopyUtils工具response.setCharacterEncoding("GB2312");response.setContentType(request.getSession().getServletContext().getMimeType(UUIDUtil.create()));//设置响应头,attachment表示以附件的形式下载,inline表示在线打开response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode("批量下载.zip", "UTF-8"));fis = new FileInputStream(zipFile);buff = new BufferedInputStream(fis);FileCopyUtils.copy(buff, os);} catch (Exception e) {log.error("【批量下载图片出现异常】异常原因" + e.getMessage());} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}if (fot != null) {try {fot.close();} catch (IOException e) {e.printStackTrace();}}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (buff != null) {try {buff.close();} catch (IOException e) {e.printStackTrace();}}}}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/209970.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python教程73:Pandas中一维数组Series学习

创建一维数据类型Series dataNone 要转化为Series的数据(也可用dict直接设置行索引) 若是标量则必须设置索引,该值会重复,来匹配索引的长度 indexNone 设置行索引 dtypeNone 设置数据类型(使用numpy数据类型) nameNone 设置Series的name属性 copyFalse 不复制 (当data为ndarray…

每日一题 1410. HTML 实体解析器(中等,模拟)

模拟&#xff0c;没什么好说的 class Solution:def entityParser(self, text: str) -> str:entityMap {&quot;: ",&apos;: "",>: >,<: <,&frasl;: /,&amp;: &,}i 0n len(text)res []while i < n:isEntity Falseif …

【从入门到起飞】JavaSE—多线程(3)(生命周期,线程安全问题,同步方法)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;生命周期&#x1f384;线程的安全问题&#…

普通平衡树

题意&#xff1a;略&#xff0c;题中较清晰。 用二叉查找树来存储数据&#xff0c;为了增加效率&#xff0c;尽量使左子树和右子树的深度差不超过一&#xff0c;这样可以时间控制在logn&#xff0c;效率比较高。 右旋和左旋&#xff0c;目的是为了维护二叉树的操作&#xff0…

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 6

1、明明买了一个扫地机器人&#xff0c;可以通过以下指令控制机器人运动: F:向前走 10 个单位长度 L:原地左转 90 度 R:原地右转 90 度 机器人初始方向向右&#xff0c;需要按顺序执行以下那条指令&#xff0c;才能打扫完下图中的道路 A、F-L-F-R-F-F-R-F-L-F B、F-R-F-L-F-F…

innoDB的缓冲池(Buffer Pool)的工作原理

数据存在磁盘了&#xff0c;总不能次次和磁盘交互吧&#xff0c;所以innoDB有一个缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;有了缓冲池后&#xff0c;读写就优先在缓冲池了。读先在缓冲池读&#xff0c;没有再去磁盘加载进缓冲池&#xff1b;写也是先写缓冲池&am…

CSGO搬砖干货,全网最详细教学!

CSGO游戏搬砖全套操作流程及注意事项&#xff08;第一课&#xff09; 在电竞游戏中&#xff0c;CSGO&#xff08;Counter-Strike: Global Offensive&#xff09;被广大玩家誉为经典之作。然而&#xff0c;除了在游戏中展现个人实力和团队合作外&#xff0c;有些玩家还将CSGO作为…

git 更换远程仓库地址三种方法总结分享

因为公司更改了 gitlab 的网段地址&#xff0c;发现全部项目都需要重新更改远程仓库的地址了&#xff0c;所以做了个记录&#xff0c;说不定以后还会用到呢。 一、不删除远程仓库修改&#xff08;最方便&#xff09; # 查看远端地址 git remote -v # 查看远端仓库名 git rem…

Java开源ETL工具-Kettle

一、背景 公司有个基于Kettle二次开发产品主要定位是做一些数据ETL的工作, 所谓的ETL就是针对数据进行抽取、转换以及加载的过程&#xff0c;说白了就是怎么对原始数据进行清洗&#xff0c;最后拿到我们需要的、符合规范的、有价值的数据进行存储或者分析的过程。 一般处理ETL的…

Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、使用、移植

Opencv3.*主模块默认包括两个3D库 calib3d用于相机校准和三维重建 &#xff0c;viz用于三维图像显示&#xff0c;其中viz是cmake选配。 参考&#xff1a; https://docs.opencv.org/3.4.12/index.html 下载linux版本的源码 sources。 查看cmake apt list --installed | grep…

代码随想录算法训练营Day 60 || 84.柱状图中最大的矩形

84.柱状图中最大的矩形 力扣题目链接(opens new window) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.length <10^50 < hei…

数据库实验三 Sql多表查询和视图

数据库实验三 Sql多表查询和视图 一、Sql表二、在线练习 一、Sql表 www.db-book.com 二、在线练习 对所有表执行查询语句&#xff0c;查看有哪些数据。 select * from tableName; 一、执行以下查询语句&#xff0c;写出查询意图。 (1) select * from student,takes whe…