mirror of
https://gitee.com/kekingcn/file-online-preview.git
synced 2026-04-04 15:27:34 +00:00
!84 新增 支持压缩包密码 修复压缩包LINUX下中文乱码 解压支持文件目录 统一JQ文件 精简一些代码
Merge pull request !84 from 高雄/master
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
|
|||||||
20
server/src/main/java/cn/keking/service/ZtreeNodeVo.java
Normal file
20
server/src/main/java/cn/keking/service/ZtreeNodeVo.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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, "压缩文件类型不受支持");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
130
server/src/main/java/cn/keking/utils/RarUtils.java
Normal file
130
server/src/main/java/cn/keking/utils/RarUtils.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user