package cn.keking.service.impl; import cn.keking.config.ConfigConstants; import cn.keking.model.FileAttribute; import cn.keking.model.ReturnResponse; import cn.keking.service.FilePreview; import cn.keking.utils.ConvertPicUtil; import cn.keking.utils.DownloadUtils; import cn.keking.utils.WebUtils; import cn.keking.web.filter.BaseUrlFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.List; /** * tiff 图片文件处理 * * @author kl (http://kailing.pub) * @since 2021/2/8 */ @Service public class TiffFilePreviewImpl implements FilePreview { private final static Logger logger = LoggerFactory.getLogger(TiffFilePreviewImpl.class); private final PictureFilePreviewImpl pictureFilePreview; private static final String INITIALIZE_MEMORY_SIZE = "initializeMemorySize"; //默认初始化 50MB 内存 private static final long INITIALIZE_MEMORY_SIZE_VALUE_DEFAULT = 1024L * 1024 * 50; private final String fileDir = ConfigConstants.getFileDir(); public TiffFilePreviewImpl(PictureFilePreviewImpl pictureFilePreview) { this.pictureFilePreview = pictureFilePreview; } @Override public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { String tifPreviewType = ConfigConstants.getTifPreviewType(); String tifOnLinePreviewType = fileAttribute.getTifPreviewType(); if (StringUtils.hasText(tifOnLinePreviewType)) { tifPreviewType = tifOnLinePreviewType; } if ("tif".equalsIgnoreCase(tifPreviewType)) { pictureFilePreview.filePreviewHandle(url, model, fileAttribute); String fileSize = WebUtils.getUrlParameterReg(url, INITIALIZE_MEMORY_SIZE); if (StringUtils.hasText(fileSize)) { model.addAttribute(INITIALIZE_MEMORY_SIZE, fileSize); } else { model.addAttribute(INITIALIZE_MEMORY_SIZE, Long.toString(INITIALIZE_MEMORY_SIZE_VALUE_DEFAULT)); } return TIFF_FILE_PREVIEW_PAGE; } else if ("jpg".equalsIgnoreCase(tifPreviewType) || "pdf".equalsIgnoreCase(tifPreviewType)) { String inputFileName = url.substring(url.lastIndexOf("/") + 1); String inputFileNamePrefix = inputFileName.substring(0, inputFileName.lastIndexOf(".")); String strLocalTif = fileDir + inputFileName; File fileTiff = new File(strLocalTif); // 如果本地不存在这个tif文件,则下载 if (!fileTiff.exists()) { ReturnResponse response = DownloadUtils.downLoad(fileAttribute, inputFileName); if (response.isFailure()) { return NOT_SUPPORTED_FILE_PAGE; } } String baseUrl = BaseUrlFilter.getBaseUrl(); if ("pdf".equalsIgnoreCase(tifPreviewType)) { // 以PDF模式预览的过程 File filePdf = new File(fileDir + inputFileNamePrefix + ".pdf"); // 如果本地不存在对应的pdf,则调用转换过程。否则直接用现有的pdf文件 if (!filePdf.exists()) { filePdf = ConvertPicUtil.convertTif2Pdf(strLocalTif, fileDir + inputFileNamePrefix + ".pdf"); } // 如果pdf已经存在,则将url路径加入到对象中,返回给页面 assert filePdf != null; if (filePdf.exists()) { String pdfUrl = baseUrl + inputFileNamePrefix + ".pdf"; model.addAttribute("pdfUrl", pdfUrl); return PDF_FILE_PREVIEW_PAGE; } } else { // 以JPG模式预览的过程 String strJpgFilePathName = fileDir + inputFileNamePrefix + ".jpg"; // 将tif转换为jpg,返回转换后的文件路径、文件名的list List listPic2Jpg = ConvertPicUtil.convertTif2Jpg(strLocalTif, strJpgFilePathName); // 将返回页面的图片url的list对象 List listImageUrls = new ArrayList<>(); // 循环,拼装url的list对象 for (String strJpg : listPic2Jpg) { listImageUrls.add(baseUrl + strJpg); } model.addAttribute("imgUrls", listImageUrls); model.addAttribute("currentUrl", listImageUrls.get(0)); } // 转换后的tif没用了,可以删掉了 if (fileTiff.exists() && !fileTiff.delete()) { logger.error("{} 清理失败", strLocalTif); } return PICTURE_FILE_PREVIEW_PAGE; } return NOT_SUPPORTED_FILE_PAGE; } }