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