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();
                }

            }
        }
    }


相关推荐
jbtianci6 分钟前
Spring Boot管理用户数据
java·spring boot·后端
编程彩机10 分钟前
互联网大厂Java面试:从Jakarta EE到微服务架构的技术场景深度解读
spring boot·分布式事务·微服务架构·java面试·jakarta ee
程序员ken13 分钟前
深入理解大语言模型(8) 使用 LangChain 开发应用程序之上下文记忆
人工智能·python·语言模型·langchain
那我掉的头发算什么21 分钟前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
wazmlp00188736921 分钟前
第五次python作业
服务器·开发语言·python
尘缘浮梦22 分钟前
websockets简单例子1
开发语言·python
不懒不懒23 分钟前
【从零开始:PyTorch实现MNIST手写数字识别全流程解析】
人工智能·pytorch·python
helloworld也报错?24 分钟前
基于CrewAI创建一个简单的智能体
人工智能·python·vllm
会算数的⑨26 分钟前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
biyezuopinvip29 分钟前
基于Spring Boot的企业网盘的设计与实现(毕业论文)
java·spring boot·vue·毕业设计·论文·毕业论文·企业网盘的设计与实现