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

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

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

java 复制代码
/**
     * 判断时间差是否超过6小时
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    public static boolean isWithin6Hours(String startTime, String endTime) {
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 将字符串转换为 LocalDateTime
        LocalDateTime 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小时!");
        }


        //查询导出图片url
        List<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();
                }

            }
        }
    }


相关推荐
乂爻yiyao15 分钟前
Spring Boot Fat JAR 容器化指南
spring boot·后端·jar
acanab1 小时前
vscode对isaac lab开发时包不能正常导入的问题
vscode·python
写代码的二次猿5 小时前
安装openfold(顺利解决版)
开发语言·python·深度学习
Eward-an5 小时前
LeetCode 1980 题通关指南|3种解法拆解“找唯一未出现二进制串”问题,附Python最优解实现
python·算法·leetcode
梦白.5 小时前
Python的容器类型
运维·python
@HNUSTer7 小时前
基于 Visual Studio Code 配置 Python 开发环境详细教程
ide·vscode·python·csdn开发云
Mr.朱鹏7 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
Nan_Shu_6147 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
tuotali20267 小时前
天然气压缩机技术2026,高可靠性长周期运行与智能运维融合路径
运维·python
智能工业品检测-奇妙智能7 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端