!84 新增 支持压缩包密码 修复压缩包LINUX下中文乱码 解压支持文件目录 统一JQ文件 精简一些代码

Merge pull request !84 from 高雄/master
This commit is contained in:
kailing
2023-04-10 03:32:42 +00:00
committed by Gitee
18 changed files with 418 additions and 738 deletions

View File

@@ -31,7 +31,7 @@
<opencv.version>4.1.2-1.5.2</opencv.version> <opencv.version>4.1.2-1.5.2</opencv.version>
<openblas.version>0.3.6-1.5.1</openblas.version> <openblas.version>0.3.6-1.5.1</openblas.version>
<ffmpeg.version>4.2.1-1.5.2</ffmpeg.version> <ffmpeg.version>4.2.1-1.5.2</ffmpeg.version>
<itext.version>2.1.7</itext.version> <itextpdf.version>5.5.13.3</itextpdf.version>
<httpclient.version>3.1</httpclient.version> <httpclient.version>3.1</httpclient.version>
<commons-cli.version>1.2</commons-cli.version> <commons-cli.version>1.2</commons-cli.version>

View File

@@ -244,10 +244,10 @@
<classifier>windows-x86_64</classifier> <classifier>windows-x86_64</classifier>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.lowagie</groupId> <groupId>com.itextpdf</groupId>
<artifactId>itext</artifactId> <artifactId>itextpdf</artifactId>
<version>${itext.version}</version> <version>${itextpdf.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.media</groupId> <groupId>javax.media</groupId>

View File

@@ -27,6 +27,8 @@ import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.*; import java.io.*;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
@@ -273,6 +275,14 @@ public class FileHandlerService {
FileType type; FileType type;
String fileName; String fileName;
String fullFileName = WebUtils.getUrlParameterReg(url, "fullfilename"); String fullFileName = WebUtils.getUrlParameterReg(url, "fullfilename");
String urlStrr = null;
URL urll;
try {
urll = new URL(url);
urlStrr = URLDecoder.decode(urll.getPath(), "UTF-8");
} catch (Exception e) {
}
if (StringUtils.hasText(fullFileName)) { if (StringUtils.hasText(fullFileName)) {
fileName = fullFileName; fileName = fullFileName;
type = FileType.typeFromFileName(fullFileName); type = FileType.typeFromFileName(fullFileName);
@@ -283,8 +293,10 @@ public class FileHandlerService {
suffix = WebUtils.suffixFromUrl(url); suffix = WebUtils.suffixFromUrl(url);
} }
if (url.contains("?fileKey=")) { if (url.contains("?fileKey=")) {
fileName=urlStrr;
attribute.setSkipDownLoad(true); attribute.setSkipDownLoad(true);
} }
// System.out.println(fileName);
url = WebUtils.encodeUrlFileName(url); url = WebUtils.encodeUrlFileName(url);
fileName = KkFileUtils.htmlEscape(fileName); //文件名处理 fileName = KkFileUtils.htmlEscape(fileName); //文件名处理
attribute.setType(type); attribute.setType(type);

View File

@@ -0,0 +1,20 @@
package cn.keking.service;
import java.util.List;
public class ZtreeNodeVo {
public String id;
public String pid;
public String name;
public List<ZtreeNodeVo> children;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPid(String pid) {
this.pid = pid;
}
public void setChildren(List<ZtreeNodeVo> children) {
this.children = children;
}
}

View File

@@ -7,10 +7,15 @@ import cn.keking.service.FilePreview;
import cn.keking.utils.DownloadUtils; import cn.keking.utils.DownloadUtils;
import cn.keking.service.FileHandlerService; import cn.keking.service.FileHandlerService;
import cn.keking.service.CompressFileReader; import cn.keking.service.CompressFileReader;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.poi.EncryptedDocumentException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.io.IOException;
/** /**
* Created by kl on 2018/1/17. * Created by kl on 2018/1/17.
* Content :处理压缩包文件 * Content :处理压缩包文件
@@ -21,7 +26,7 @@ public class CompressFilePreviewImpl implements FilePreview {
private final FileHandlerService fileHandlerService; private final FileHandlerService fileHandlerService;
private final CompressFileReader compressFileReader; private final CompressFileReader compressFileReader;
private final OtherFilePreviewImpl otherFilePreview; private final OtherFilePreviewImpl otherFilePreview;
private static final String Rar_PASSWORD_MSG = "password";
public CompressFilePreviewImpl(FileHandlerService fileHandlerService, CompressFileReader compressFileReader, OtherFilePreviewImpl otherFilePreview) { public CompressFilePreviewImpl(FileHandlerService fileHandlerService, CompressFileReader compressFileReader, OtherFilePreviewImpl otherFilePreview) {
this.fileHandlerService = fileHandlerService; this.fileHandlerService = fileHandlerService;
this.compressFileReader = compressFileReader; this.compressFileReader = compressFileReader;
@@ -31,7 +36,8 @@ public class CompressFilePreviewImpl implements FilePreview {
@Override @Override
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
String fileName=fileAttribute.getName(); String fileName=fileAttribute.getName();
String fileTree; String filePassword = fileAttribute.getFilePassword();
String fileTree = null;
// 判断文件名是否存在(redis缓存读取) // 判断文件名是否存在(redis缓存读取)
if (!StringUtils.hasText(fileHandlerService.getConvertedFile(fileName)) || !ConfigConstants.isCacheEnabled()) { if (!StringUtils.hasText(fileHandlerService.getConvertedFile(fileName)) || !ConfigConstants.isCacheEnabled()) {
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, fileName); ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, fileName);
@@ -39,21 +45,32 @@ public class CompressFilePreviewImpl implements FilePreview {
return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg()); return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
} }
String filePath = response.getContent(); String filePath = response.getContent();
fileTree = compressFileReader.unRar(filePath, fileName); try {
if (fileTree != null && !"null".equals(fileTree)) { fileTree = compressFileReader.unRar(filePath, filePassword,fileName);
} catch (Exception e) {
Throwable[] throwableArray = ExceptionUtils.getThrowables(e);
for (Throwable throwable : throwableArray) {
if (throwable instanceof IOException || throwable instanceof EncryptedDocumentException) {
if (e.getMessage().toLowerCase().contains(Rar_PASSWORD_MSG)) {
model.addAttribute("needFilePassword", true);
return EXEL_FILE_PREVIEW_PAGE;
}
}
}
}
if (!ObjectUtils.isEmpty(fileTree)) {
if (ConfigConstants.isCacheEnabled()) { if (ConfigConstants.isCacheEnabled()) {
// 加入缓存 // 加入缓存
fileHandlerService.addConvertedFile(fileName, fileTree); fileHandlerService.addConvertedFile(fileName, fileTree);
} }
}else {
return otherFilePreview.notSupportedFile(model, fileAttribute, "压缩文件密码错误! 压缩文件损坏! 压缩文件类型不受支持!");
} }
} else { } else {
fileTree = fileHandlerService.getConvertedFile(fileName); fileTree = fileHandlerService.getConvertedFile(fileName);
} }
if (fileTree != null && !"null".equals(fileTree)) { model.addAttribute("fileName", fileName);
model.addAttribute("fileTree", fileTree); model.addAttribute("fileTree", fileTree);
return COMPRESS_FILE_PREVIEW_PAGE; return COMPRESS_FILE_PREVIEW_PAGE;
} else {
return otherFilePreview.notSupportedFile(model, fileAttribute, "压缩文件类型不受支持");
}
} }
} }

View File

@@ -3,13 +3,11 @@ package cn.keking.service.impl;
import cn.keking.config.ConfigConstants; import cn.keking.config.ConfigConstants;
import cn.keking.model.FileAttribute; import cn.keking.model.FileAttribute;
import cn.keking.model.ReturnResponse; import cn.keking.model.ReturnResponse;
import cn.keking.service.FileHandlerService;
import cn.keking.service.FilePreview; import cn.keking.service.FilePreview;
import cn.keking.utils.ConvertPicUtil; import cn.keking.utils.ConvertPicUtil;
import cn.keking.utils.DownloadUtils; import cn.keking.utils.DownloadUtils;
import cn.keking.utils.WebUtils;
import cn.keking.web.filter.BaseUrlFilter; import cn.keking.web.filter.BaseUrlFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -27,72 +25,64 @@ import java.util.List;
@Service @Service
public class TiffFilePreviewImpl implements FilePreview { public class TiffFilePreviewImpl implements FilePreview {
private final static Logger logger = LoggerFactory.getLogger(TiffFilePreviewImpl.class); private final FileHandlerService fileHandlerService;
private final OtherFilePreviewImpl otherFilePreview;
private final PictureFilePreviewImpl pictureFilePreview; public TiffFilePreviewImpl(FileHandlerService fileHandlerService,OtherFilePreviewImpl otherFilePreview) {
private static final String INITIALIZE_MEMORY_SIZE = "initializeMemorySize"; this.fileHandlerService = fileHandlerService;
//默认初始化 50MB 内存 this.otherFilePreview = otherFilePreview;
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;
} }
private final String fileDir = ConfigConstants.getFileDir();
@Override @Override
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
String fileName = fileAttribute.getName();
String baseUrl = BaseUrlFilter.getBaseUrl();
String tifPreviewType = ConfigConstants.getTifPreviewType(); String tifPreviewType = ConfigConstants.getTifPreviewType();
String tifOnLinePreviewType = fileAttribute.getTifPreviewType(); String tifOnLinePreviewType = fileAttribute.getTifPreviewType();
if (StringUtils.hasText(tifOnLinePreviewType)) { if (StringUtils.hasText(tifOnLinePreviewType)) {
tifPreviewType = tifOnLinePreviewType; tifPreviewType = tifOnLinePreviewType;
} }
if ("tif".equalsIgnoreCase(tifPreviewType)) { if ("tif".equalsIgnoreCase(tifPreviewType)) {
model.addAttribute("currentUrl", url);
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; return TIFF_FILE_PREVIEW_PAGE;
} else if ("jpg".equalsIgnoreCase(tifPreviewType) || "pdf".equalsIgnoreCase(tifPreviewType)) { } else if ("jpg".equalsIgnoreCase(tifPreviewType) || "pdf".equalsIgnoreCase(tifPreviewType)) {
String inputFileName = url.substring(url.lastIndexOf("/") + 1); String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + "pdf";
String inputFileNamePrefix = inputFileName.substring(0, inputFileName.lastIndexOf(".")); String jpgName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + "jpg";
String strLocalTif = fileDir + fileName;
String strLocalTif = fileDir + inputFileName; String outFilePath = fileDir + pdfName;
File fileTiff = new File(strLocalTif);
// 如果本地不存在这个tif文件则下载
if (!fileTiff.exists()) {
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, inputFileName);
if (response.isFailure()) {
return NOT_SUPPORTED_FILE_PAGE;
}
}
String baseUrl = BaseUrlFilter.getBaseUrl();
if ("pdf".equalsIgnoreCase(tifPreviewType)) { if ("pdf".equalsIgnoreCase(tifPreviewType)) {
// 以PDF模式预览的过程 //当文件不存在时,就去下载
File filePdf = new File(fileDir + inputFileNamePrefix + ".pdf"); if (!fileHandlerService.listConvertedFiles().containsKey(pdfName) || !ConfigConstants.isCacheEnabled()) {
// 如果本地不存在对应的pdf则调用转换过程。否则直接用现有的pdf文件 ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, fileName);
if (!filePdf.exists()) { if (response.isFailure()) {
filePdf = ConvertPicUtil.convertTif2Pdf(strLocalTif, fileDir + inputFileNamePrefix + ".pdf"); return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
} }
String filePath = response.getContent();
// 如果pdf已经存在则将url路径加入到对象中返回给页面 if (ConfigConstants.isCacheEnabled()) {
assert filePdf != null; // 加入缓存
if (filePdf.exists()) { fileHandlerService.addConvertedFile(pdfName, fileHandlerService.getRelativePath(outFilePath));
String pdfUrl = baseUrl + inputFileNamePrefix + ".pdf"; }
model.addAttribute("pdfUrl", pdfUrl); if(ConvertPicUtil.convertJpg2Pdf(filePath, outFilePath)){
model.addAttribute("pdfUrl", pdfName);
return PDF_FILE_PREVIEW_PAGE;
}
}
else {
model.addAttribute("pdfUrl", pdfName);
return PDF_FILE_PREVIEW_PAGE; return PDF_FILE_PREVIEW_PAGE;
} }
} else { } else {
File fileTiff = new File(strLocalTif);
// 如果本地不存在这个tif文件则下载
if (!fileTiff.exists()) {
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, fileName);
if (response.isFailure()) {
return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
}
strLocalTif = response.getContent();
}
// 以JPG模式预览的过程 // 以JPG模式预览的过程
String strJpgFilePathName = fileDir + inputFileNamePrefix + ".jpg"; String strJpgFilePathName = fileDir + jpgName;
// 将tif转换为jpg返回转换后的文件路径、文件名的list // 将tif转换为jpg返回转换后的文件路径、文件名的list
List<String> listPic2Jpg = ConvertPicUtil.convertTif2Jpg(strLocalTif, strJpgFilePathName); List<String> listPic2Jpg = ConvertPicUtil.convertTif2Jpg(strLocalTif, strJpgFilePathName);
// 将返回页面的图片url的list对象 // 将返回页面的图片url的list对象
@@ -101,19 +91,11 @@ public class TiffFilePreviewImpl implements FilePreview {
for (String strJpg : listPic2Jpg) { for (String strJpg : listPic2Jpg) {
listImageUrls.add(baseUrl + strJpg); listImageUrls.add(baseUrl + strJpg);
} }
model.addAttribute("imgUrls", listImageUrls); model.addAttribute("imgUrls", listImageUrls);
model.addAttribute("currentUrl", listImageUrls.get(0)); model.addAttribute("currentUrl", listImageUrls.get(0));
} }
// 转换后的tif没用了可以删掉了
if (fileTiff.exists() && !fileTiff.delete()) {
logger.error("{} 清理失败", strLocalTif);
}
return PICTURE_FILE_PREVIEW_PAGE; return PICTURE_FILE_PREVIEW_PAGE;
} }
return NOT_SUPPORTED_FILE_PAGE; return NOT_SUPPORTED_FILE_PAGE;
} }
} }

View File

@@ -1,16 +1,17 @@
package cn.keking.utils; package cn.keking.utils;
import com.lowagie.text.Document; import cn.keking.config.ConfigConstants;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.RandomAccessFileOrArray;
import com.lowagie.text.pdf.codec.TiffImage;
import com.sun.media.jai.codec.*; import com.sun.media.jai.codec.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.io.FileChannelRandomAccessSource;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;
import javax.media.jai.JAI; import javax.media.jai.JAI;
import javax.media.jai.RenderedOp; import javax.media.jai.RenderedOp;
import java.awt.image.RenderedImage; import java.awt.image.RenderedImage;
@@ -18,13 +19,14 @@ import java.awt.image.renderable.ParameterBlock;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ConvertPicUtil { public class ConvertPicUtil {
private final static Logger logger = LoggerFactory.getLogger(ConvertPicUtil.class); private final static Logger logger = LoggerFactory.getLogger(ConvertPicUtil.class);
private final static String fileDir = ConfigConstants.getFileDir();
/** /**
* Tif 转 JPG。 * Tif 转 JPG。
* *
@@ -42,25 +44,21 @@ public class ConvertPicUtil {
logger.info("找不到文件【" + strInputFile + ""); logger.info("找不到文件【" + strInputFile + "");
return null; return null;
} }
strInputFile = strInputFile.replaceAll("\\\\", "/"); strInputFile = strInputFile.replaceAll("\\\\", "/");
strOutputFile = strOutputFile.replaceAll("\\\\", "/"); strOutputFile = strOutputFile.replaceAll("\\\\", "/");
FileSeekableStream fileSeekStream = null; FileSeekableStream fileSeekStream = null;
try { try {
JPEGEncodeParam jpegEncodeParam = new JPEGEncodeParam(); JPEGEncodeParam jpegEncodeParam = new JPEGEncodeParam();
TIFFEncodeParam tiffEncodeParam = new TIFFEncodeParam(); TIFFEncodeParam tiffEncodeParam = new TIFFEncodeParam();
tiffEncodeParam.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4); tiffEncodeParam.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
tiffEncodeParam.setLittleEndian(false); tiffEncodeParam.setLittleEndian(false);
String jpgname = strInputFile.replace(fileDir.replace("\\","/"), "");
String strFilePrefix = strInputFile.substring(strInputFile.lastIndexOf("/") + 1, strInputFile.lastIndexOf(".")); int index = jpgname.lastIndexOf(".");
String strFilePrefix = jpgname.substring(0, index);
fileSeekStream = new FileSeekableStream(strInputFile); fileSeekStream = new FileSeekableStream(strInputFile);
ImageDecoder imageDecoder = ImageCodec.createImageDecoder("TIFF", fileSeekStream, null); ImageDecoder imageDecoder = ImageCodec.createImageDecoder("TIFF", fileSeekStream, null);
int intTifCount = imageDecoder.getNumPages(); int intTifCount = imageDecoder.getNumPages();
logger.info("该tif文件共有【" + intTifCount + "】页"); logger.info("该tif文件共有【" + intTifCount + "】页");
String strJpgPath; String strJpgPath;
String strJpgUrl; String strJpgUrl;
if (intTifCount == 1) { if (intTifCount == 1) {
@@ -87,9 +85,7 @@ public class ConvertPicUtil {
strJpg = strJpgPath + "/" + i + ".jpg"; strJpg = strJpgPath + "/" + i + ".jpg";
strJpgUrl = strFilePrefix + "/" + i + ".jpg"; strJpgUrl = strFilePrefix + "/" + i + ".jpg";
} }
File fileJpg = new File(strJpg); File fileJpg = new File(strJpg);
// 如果文件不存在,则生成 // 如果文件不存在,则生成
if (!fileJpg.exists()) { if (!fileJpg.exists()) {
RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(i); RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(i);
@@ -98,13 +94,11 @@ public class ConvertPicUtil {
pb.add(fileJpg.toString()); pb.add(fileJpg.toString());
pb.add("JPEG"); pb.add("JPEG");
pb.add(jpegEncodeParam); pb.add(jpegEncodeParam);
RenderedOp renderedOp = JAI.create("filestore", pb); RenderedOp renderedOp = JAI.create("filestore", pb);
renderedOp.dispose(); renderedOp.dispose();
logger.info("每页分别保存至: " + fileJpg.getCanonicalPath()); logger.info("每页分别保存至: " + fileJpg.getCanonicalPath());
} else { } else {
logger.info("JPG文件已存在 " + fileJpg.getCanonicalPath()); // logger.info("JPG文件已存在 " + fileJpg.getCanonicalPath());
} }
listImageFiles.add(strJpgUrl); listImageFiles.add(strJpgUrl);
@@ -131,101 +125,45 @@ public class ConvertPicUtil {
* @param strJpgFile 输入的jpg的路径和文件名 * @param strJpgFile 输入的jpg的路径和文件名
* @param strPdfFile 输出的pdf的路径和文件名 * @param strPdfFile 输出的pdf的路径和文件名
*/ */
public static void convertJpg2Pdf(String strJpgFile, String strPdfFile) { private static final int FIT_WIDTH = 500;
Document document = new Document(); private static final int FIT_HEIGHT = 900;
// 设置文档页边距 public static boolean convertJpg2Pdf(String strJpgFile, String strPdfFile) {
document.setMargins(0, 0, 0, 0); Document document= null;
RandomAccessFileOrArray rafa = null;
FileOutputStream fos = null;
try { try {
fos = new FileOutputStream(strPdfFile); document = new Document();
PdfWriter.getInstance(document, fos); PdfWriter.getInstance(document, new FileOutputStream(strPdfFile));
// 打开文档
document.open(); document.open();
// 获取图片的宽高 rafa = new RandomAccessFileOrArray(new FileChannelRandomAccessSource(new RandomAccessFile(strJpgFile, "r").getChannel()));
Image image = Image.getInstance(strJpgFile); int pages = TiffImage.getNumberOfPages(rafa);
float floatImageHeight = image.getScaledHeight(); Image image;
float floatImageWidth = image.getScaledWidth(); for (int i = 1; i <= pages; i++) {
// 设置页面宽高与图片一致 try {
Rectangle rectangle = new Rectangle(floatImageWidth, floatImageHeight); image = TiffImage.getTiffImage(rafa, i);
document.setPageSize(rectangle); image.scaleToFit(FIT_WIDTH, FIT_HEIGHT);
// 图片居中 document.add(image);
image.setAlignment(Image.ALIGN_CENTER); } catch (Exception e) {
//新建一页添加图片 document.close();
document.newPage(); rafa.close();
document.add(image); e.printStackTrace();
} catch (Exception ioe) { }
ioe.printStackTrace(); }
} finally { document.close();
//关闭文档 rafa.close();
return true;
}
catch (Exception e)
{
System.out.println("错误:"+ e.getMessage());
}
finally {
document.close(); document.close();
try { try {
assert fos != null; rafa.close();
fos.flush();
fos.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
return false;
} }
/**
* 将Tif图片转换为Pdf文件支持多页Tif
*
* @param strTifFile 输入的tif的路径和文件名
* @param strPdfFile 输出的pdf的路径和文件名
* @return File
*/
public static File convertTif2Pdf(String strTifFile, String strPdfFile) {
try {
RandomAccessFileOrArray rafa = new RandomAccessFileOrArray(strTifFile);
Document document = new Document();
// 设置文档页边距
document.setMargins(0, 0, 0, 0);
PdfWriter.getInstance(document, new FileOutputStream(strPdfFile));
document.open();
int intPages = TiffImage.getNumberOfPages(rafa);
Image image;
File filePDF;
if (intPages == 1) {
String strJpg = strTifFile.substring(0, strTifFile.lastIndexOf(".")) + ".jpg";
File fileJpg = new File(strJpg);
List<String> listPic2Jpg = convertTif2Jpg(strTifFile, strJpg);
if (listPic2Jpg != null && fileJpg.exists()) {
convertJpg2Pdf(strJpg, strPdfFile);
}
} else {
for (int i = 1; i <= intPages; i++) {
image = TiffImage.getTiffImage(rafa, i);
// 设置页面宽高与图片一致
Rectangle pageSize = new Rectangle(image.getScaledWidth(), image.getScaledHeight());
document.setPageSize(pageSize);
// 图片居中
image.setAlignment(Image.ALIGN_CENTER);
//新建一页添加图片
document.newPage();
document.add(image);
}
document.close();
}
rafa.close();
filePDF = new File(strPdfFile);
return filePDF;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return null;
}
} }

View File

@@ -3,16 +3,17 @@ package cn.keking.utils;
import cn.keking.config.ConfigConstants; import cn.keking.config.ConfigConstants;
import cn.keking.model.FileAttribute; import cn.keking.model.FileAttribute;
import cn.keking.model.ReturnResponse; import cn.keking.model.ReturnResponse;
import cn.keking.service.FileHandlerService;
import io.mola.galimatias.GalimatiasParseException; import io.mola.galimatias.GalimatiasParseException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.util.HtmlUtils;
import java.io.*; import java.io.File;
import java.net.*; import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.UUID; import java.util.UUID;
import static cn.keking.utils.KkFileUtils.isFtpUrl; import static cn.keking.utils.KkFileUtils.isFtpUrl;
@@ -36,13 +37,24 @@ public class DownloadUtils {
*/ */
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) { public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
// 忽略ssl证书 // 忽略ssl证书
String urlStr = null;
String urlStrr = null;
URL urll;
try { try {
SslUtils.ignoreSsl(); SslUtils.ignoreSsl();
urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
urll = new URL(urlStr);
urlStrr = URLDecoder.decode(urll.getPath(), "UTF-8");
} catch (Exception e) { } catch (Exception e) {
logger.error("忽略SSL证书异常:", e); logger.error("忽略SSL证书异常:", e);
} }
String urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", ""); ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
assert urlStr != null;
if (urlStr.contains("?fileKey=")) {
response.setContent(fileDir + urlStrr);
response.setMsg(fileName);
return response;
}
String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute); String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute);
if(!StringUtils.hasText(realPath)){ if(!StringUtils.hasText(realPath)){
response.setCode(1); response.setCode(1);

View File

@@ -0,0 +1,130 @@
package cn.keking.utils;
import cn.keking.config.ConfigConstants;
import cn.keking.service.ZtreeNodeVo;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author : Gao
* create : 2023-04-08
**/
public class RarUtils {
private static final String fileDir = ConfigConstants.getFileDir();
public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
int n = gbkStr.length();
byte[] utfBytes = new byte[3 * n];
int k = 0;
for (int i = 0; i < n; i++) {
int m = gbkStr.charAt(i);
if (m < 128 && m >= 0) {
utfBytes[k++] = (byte) m;
continue;
}
utfBytes[k++] = (byte) (0xe0 | (m >> 12));
utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
}
if (k < utfBytes.length) {
byte[] tmp = new byte[k];
System.arraycopy(utfBytes, 0, tmp, 0, k);
return tmp;
}
return utfBytes;
}
public static String getUtf8String(String str) {
if (str != null && str.length() > 0) {
String needEncodeCode = "ISO-8859-1";
String neeEncodeCode = "ISO-8859-2";
String gbkEncodeCode = "GBK";
try {
if (Charset.forName(needEncodeCode).newEncoder().canEncode(str)) {
str = new String(str.getBytes(needEncodeCode), StandardCharsets.UTF_8);
}
if (Charset.forName(neeEncodeCode).newEncoder().canEncode(str)) {
str = new String(str.getBytes(neeEncodeCode), StandardCharsets.UTF_8);
}
if (Charset.forName(gbkEncodeCode).newEncoder().canEncode(str)) {
str = new String(getUTF8BytesFromGBKString(str), StandardCharsets.UTF_8);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return str;
}
/**
* 判断是否是中日韩文字
*/
private static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS;
}
public static boolean judge(char c){
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z');
}
public static boolean isMessyCode(String strName) {
//去除字符串中的空格 制表符 换行 回车
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("").replaceAll("\\+", "").replaceAll("#", "").replaceAll("&", "");
//去除字符串中的标点符号
String temp = after.replaceAll("\\p{P}", "");
//处理之后转换成字符数组
char[] ch = temp.trim().toCharArray();
for (char c : ch) {
//判断是否是数字或者英文字符
if (!judge(c)) {
//判断是否是中日韩文
if (!isChinese(c)) {
//如果不是数字或者英文字符也不是中日韩文则表示是乱码返回true
return true;
}
}
}
//表示不是乱码 返回false
return false;
}
/**
* 读取文件目录树
*/
public static List<ZtreeNodeVo> getTree(String rootPath) {
List<ZtreeNodeVo> nodes = new ArrayList<>();
File file = new File(fileDir+rootPath);
ZtreeNodeVo node = traverse(file);
nodes.add(node);
return nodes;
}
private static ZtreeNodeVo traverse(File file) {
ZtreeNodeVo pathNodeVo = new ZtreeNodeVo();
pathNodeVo.setId(file.getAbsolutePath().replace(fileDir, "").replace("\\", "/"));
pathNodeVo.setName(file.getName());
pathNodeVo.setPid(file.getParent().replace(fileDir, "").replace("\\", "/"));
if (file.isDirectory()) {
List<ZtreeNodeVo> subNodeVos = new ArrayList<>();
File[] subFiles = file.listFiles();
if (subFiles == null) {
return pathNodeVo;
}
for (File subFile : subFiles) {
ZtreeNodeVo subNodeVo = traverse(subFile);
subNodeVos.add(subNodeVo);
}
pathNodeVo.setChildren(subNodeVos);
}
return pathNodeVo;
}
}

View File

@@ -3,6 +3,7 @@ package cn.keking.web.controller;
import cn.keking.config.ConfigConstants; import cn.keking.config.ConfigConstants;
import cn.keking.model.ReturnResponse; import cn.keking.model.ReturnResponse;
import cn.keking.utils.KkFileUtils; import cn.keking.utils.KkFileUtils;
import cn.keking.utils.RarUtils;
import cn.keking.utils.WebUtils; import cn.keking.utils.WebUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -20,12 +21,7 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/** /**
* @author yudian-it * @author yudian-it
@@ -162,6 +158,21 @@ public class FileController {
return ReturnResponse.success(fileName); return ReturnResponse.success(fileName);
} }
@GetMapping("/directory")
public Object directory(String urls) {
String fileUrl;
try {
fileUrl = WebUtils.decodeUrl(urls);
} catch (Exception ex) {
String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
return ReturnResponse.failure(errorMsg);
}
if (KkFileUtils.isIllegalFileName(fileUrl)) {
return ReturnResponse.failure("不允许访问的路径:");
}
return RarUtils.getTree(fileUrl);
}
private boolean existsFile(String fileName) { private boolean existsFile(String fileName) {
File file = new File(fileDir + demoPath + fileName); File file = new File(fileDir + demoPath + fileName);
return file.exists(); return file.exists();

File diff suppressed because one or more lines are too long

View File

@@ -25685,7 +25685,7 @@
if (!e) if (!e)
return t; return t;
if (!g || "" == y) { if (!g || "" == y) {
var r, i = 10, o = l(e.pages); var r, i = e.pages.length, o = l(e.pages);
try { try {
for (o.s(); !(r = o.n()).done; ) { for (o.s(); !(r = o.n()).done; ) {
var a = r.value var a = r.value

File diff suppressed because one or more lines are too long

View File

@@ -10,18 +10,15 @@
<meta name=keywords content="Xmind,mindmap,mind map,mind mapping,mind mapping software,free mind mapping software,work from home,WFH,remote"> <meta name=keywords content="Xmind,mindmap,mind map,mind mapping,mind mapping software,free mind mapping software,work from home,WFH,remote">
<link rel=stylesheet href=css/bootstrap-customized-2821153174.min.css> <link rel=stylesheet href=css/bootstrap-customized-2821153174.min.css>
<link rel=stylesheet href=css/index-5376440060.css> <link rel=stylesheet href=css/index-5376440060.css>
<script src=js/jquery-3-c9f5aeeca3.2.1.min.js> </script> <script src="../js/jquery-3.6.1.min.js"></script>
<meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> <meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<link rel=stylesheet href=css/share-embed-39eba5407f.css> </head> <link rel=stylesheet href=css/share-embed-39eba5407f.css> </head>
<body> <body>
<script> <script>
window.manifests={snowbrush:"js/snowbrush.js"},window.metadataString="" window.manifests={snowbrush:"js/snowbrush.js"},window.metadataString=""
</script> </script>
<script src=js/text-autospace-fed758f4a6.min.js> </script>
<script src=js/polyfill-45b9836beb.min.js> </script> <script src=js/polyfill-45b9836beb.min.js> </script>
<script src=js/js-cookie-a978ac7394.js> </script> <script src=js/js-cookie-a978ac7394.js> </script>
<script src=js/popper-135fa9e662.min.js> </script>
<script src=js/bootstrap-26779614c4.min.js> </script>
<script src=js/base.61517cade8.js> </script> <script src=js/base.61517cade8.js> </script>
<script src=js/share-embed.68f7476360.js> </script> <script src=js/share-embed.68f7476360.js> </script>
</body> </body>

File diff suppressed because one or more lines are too long

View File

@@ -1,108 +1,71 @@
<!DOCTYPE html> <!DOCTYPE html>
<html>
<html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0"> <title>压缩包预览</title>
<#include "*/commonHeader.ftl"> <script src="js/jquery-3.6.1.min.js"></script>
<script src="js/jquery-3.6.1.min.js" type="text/javascript"></script> <#include "*/commonHeader.ftl">
<link href="css/zTreeStyle.css" rel="stylesheet" type="text/css"> <script src="js/base64.min.js" type="text/javascript"></script>
<script src="js/base64.min.js" type="text/javascript"></script> <link href="css/zTreeStyle.css" rel="stylesheet" type="text/css">
<style type="text/css"> <script type="text/javascript" src="js/jquery.ztree.core.js"></script>
<style type="text/css">
body { body {
background-color: #404040; background-color: #404040;
} }
h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;}
h1 {font-size: 24px;line-height: 34px;text-align: center;} h1 {font-size: 24px;line-height: 34px;text-align: center;}
h2 {font-size: 14px;line-height: 24px;padding-top: 5px;}
h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;}
a {color:#3C6E31;text-decoration: underline;} a {color:#3C6E31;text-decoration: underline;}
a:hover {background-color:#3C6E31;color:white;} a:hover {background-color:#3C6E31;color:white;}
code {color: #2f332a;} code {color: #2f332a;}
div.zTreeDemoBackground {width:600px;text-align:center;margin: 0 auto;background-color: #ffffff;} div.zTreeDemoBackground {
max-width: 880px;
text-align:center;
margin:0 auto;
border-radius:3px;
box-shadow:rgba(0,0,0,0.15) 0 0 8px;
background:#FBFBFB;
border:1px solid #ddd;
margin:1px auto;
padding:5px;
}
</style> </style>
</head> </head>
<body> <body>
<div class="zTreeDemoBackground left"> <div class="zTreeDemoBackground left">
<h1>kkFileView</h1>
<ul id="treeDemo" class="ztree"></ul> <ul id="treeDemo" class="ztree"></ul>
</div> </div>
<script type="text/javascript" src="js/jquery.ztree.core.js"></script> <script>
var settings = {
<script type="text/javascript">
const data = JSON.parse('${fileTree}');
var baseUrl = "${baseUrl}";
var setting = {
view: {
fontCss : {"color":"blue"},
showLine: true
},
data: { data: {
key: { simpleData: {
children: 'childList', enable: true, //true 、 false 分别表示 使用 、 不使用 简单数据模式
name: 'originName' idKey: "id", //节点数据中保存唯一标识的属性名称
pIdKey: "pid", //节点数据中保存其父节点唯一标识的属性名称
rootPId: ""
} }
}, },
callback:{ callback: {
beforeClick:function (treeId, treeNode, clickFlag) { onClick: chooseNode,
console.log("节点参数treeId-" + treeId + "treeNode-"
+ JSON.stringify(treeNode) + "clickFlag-" + clickFlag);
},
onClick:function (event, treeId, treeNode) {
if (!treeNode.directory) {
/**实现窗口最大化**/
var fulls = "left=0,screenX=0,top=0,screenY=0,scrollbars=1"; //定义弹出窗口的参数
if (window.screen) {
var ah = screen.availHeight - 30;
var aw = (screen.availWidth - 10) / 2;
fulls += ",height=" + ah;
fulls += ",innerHeight=" + ah;
fulls += ",width=" + aw;
fulls += ",innerWidth=" + aw;
fulls += ",resizable"
} else {
fulls += ",resizable"; // 对于不支持screen属性的浏览器可以手工进行最大化。 manually
}
var previewUrl = baseUrl + treeNode.fileName +"?fileKey="+ treeNode.fileKey;
window.open("onlinePreview?url=" + encodeURIComponent(Base64.encode(previewUrl)), "_blank",fulls);
}
}
} }
}; };
var height = 0;
$(document).ready(function(){ function chooseNode(event, treeId, treeNode) {
var treeObj = $.fn.zTree.init($("#treeDemo"), setting, data); var path = '${baseUrl}' + treeNode.id +"?fileKey="+'${fileName}';
treeObj.expandAll(true); location.href = "${baseUrl}onlinePreview?url=" + encodeURIComponent(Base64.encode(path));
height = getZtreeDomHeight(); }
$(".zTreeDemoBackground").css("height", height);
$(document).ready(function () {
var url = '${fileTree}';
$.ajax({
type: "get",
url: "${baseUrl}directory?urls="+encodeURIComponent(Base64.encode(url)),
success: function (res) {
zTreeObj = $.fn.zTree.init($("#treeDemo"), settings, res); //初始化树
zTreeObj.expandAll(true); //true 节点全部展开、false节点收缩
}
});
}); });
/*初始化水印*/
window.onload = function() {
initWaterMark();
}
/**
* 计算ztreedom的高度
*/
function getZtreeDomHeight() {
return $("#treeDemo").height() > window.document.documentElement.clientHeight - 1
? $("#treeDemo").height() : window.document.documentElement.clientHeight - 1;
}
/**
* 页面变化调整高度
*/
window.onresize = function(){
height = getZtreeDomHeight();
$(".zTreeDemoBackground").css("height", height);
}
/**
* 滚动时调整高度
*/
window.onscroll = function(){
height = getZtreeDomHeight();
$(".zTreeDemoBackground").css("height", height);
}
</script> </script>
</body> </body>
</html> </html>

View File

@@ -80,7 +80,7 @@
</div> </div>
<!-- JavaSript ================================================== --> <!-- JavaSript ================================================== -->
<script src="pptx/jquery-3.5.1.min.js"></script> <script src="js/jquery-3.6.1.min.js"></script>
<script src="pptx/jquery.contextMenu.js?v=11.2.5_20210128"></script> <script src="pptx/jquery.contextMenu.js?v=11.2.5_20210128"></script>
<script src="pptx/idocv/idocv_common.min.js"></script> <script src="pptx/idocv/idocv_common.min.js"></script>
<script src="pptx/jquery.mobile-events.min.js"></script> <script src="pptx/jquery.mobile-events.min.js"></script>