Newer
Older
casic-metering-biz-xichang / casic-metering-common / src / main / java / com / casic / missiles / utils / TemplateUtils.java
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();
        }
    }
}