package com.casic.missiles.utils; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.generator.SnowflakeGenerator; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.system.SystemTemplateMapper; import com.casic.missiles.model.system.SystemTemplate; import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import java.util.Optional; /** * @Author: TuT * @CreateTime: 2024-04-11 15:55 * @Description: TemplateUtils */ @Slf4j @Component public class TemplateUtils { @Autowired private MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; @Value("${casic.file.dir}") private String localFileDir; @Autowired private SystemTemplateMapper systemTemplateMapper; /** * 模板名称 * * @param templateName 模板类型 * @param templateType 文件服务器名称 * @return String minioFileName */ public String selectTemplateFileName(String templateName, String templateType) { LambdaQueryWrapper<SystemTemplate> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SystemTemplate::getTemplateName, templateName); queryWrapper.eq(SystemTemplate::getTemplateType, templateType); List<SystemTemplate> templateList = systemTemplateMapper.selectList(queryWrapper); Optional<SystemTemplate> systemTemplate = templateList.stream().findFirst(); SystemTemplate template = systemTemplate.orElse(null); if (template.getMinioFileName() == null) { throw new BusinessException(BusinessExceptionEnum.MINIO_FILE_NAME_NOT_EXIST); } return template.getMinioFileName(); } /** * @param fileName * @return */ public String downloadTemplate(String fileName) { String fileUrl = localFileDir; Snowflake snowflake = new Snowflake(1, 1); String id = snowflake.nextIdStr(); fileUrl = fileUrl + id + File.separator; File file = new File(fileUrl); if (file.exists()) { file.delete(); } file.mkdirs(); InputStream in = null; ByteArrayOutputStream out = null; try { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); IOUtils.copy(in, out); //封装返回值 byte[] bytes = out.toByteArray(); this.byteToFile(bytes, fileUrl, fileName); } catch (Exception e) { log.error("download file failed", e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { log.error("close inputStream failed", e); } } if (out != null) { try { out.close(); } catch (IOException e) { log.error("close outputStream failed", e); } } } return fileUrl; } /** * @param bytes * @param localFileDir * @param fileName */ private void byteToFile(byte[] bytes, String localFileDir, String fileName) { BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; try { File dir = new File(localFileDir); if (!dir.exists() && dir.isDirectory()) { dir.mkdirs(); } file = new File(localFileDir + File.separator + fileName); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bytes); } catch (Exception e) { log.error("Failed to save file '{}' to disk at '{}'. Exception:", fileName, localFileDir, e); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { log.error("Failed to close BufferedOutputStream for file '{}'. Exception:", fileName, e); } } if (fos != null) { try { fos.close(); } catch (IOException e) { log.error("Failed to close FileOutputStream for file '{}'. Exception:", fileName, e); } } } } public synchronized String downloadFile(List<String> fileNameList, String zipLocalFileDir) { String fileUrl = localFileDir + zipLocalFileDir; File file = new File(fileUrl); if (!file.exists()) { file.mkdirs(); } if (CollectionUtils.isEmpty(fileNameList)) { return null; } InputStream in = null; ByteArrayOutputStream out = null; try { for (String fileName : fileNameList) { if (StringUtils.isNotBlank(fileName)) { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); IOUtils.copy(in, out); //封装返回值 byte[] bytes = out.toByteArray(); byteToFile(bytes, fileUrl, fileName); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } return fileUrl; } /** * @param file */ public void deleteFile(File file) { //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] files = file.listFiles(); int length = files.length; if (files != null) {//如果包含文件进行删除操作 for (int i = 0; i < length; i++) { if (files[i].isFile()) { //删除子文件 files[i].delete(); } else if (files[i].isDirectory()) { //通过递归的方法找到子目录的文件 deleteFile(files[i]); } } } if (file.list().length == 0) { log.debug("invalid print file has already delete success!"); } //删除子目录 if (file != null && file.isDirectory()) { file.delete(); } } }