Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f4a912a362 | |||
| 546d9f559d | |||
| d4f7613b7d | |||
| 7c963193ef | |||
| bce9a624d7 | |||
| dac3606b4e | |||
| eb00385d76 | |||
| 986f562266 |
@ -1,5 +1,7 @@
|
|||||||
[#ftl]
|
[#ftl]
|
||||||
[#-- @implicitly included --]
|
[#-- @implicitly included --]
|
||||||
|
[#-- @ftlvariable name="file" type="cn.keking.model.FileAttribute" --]
|
||||||
|
[#-- @ftlvariable name="fileName" type="java.lang.String" --]
|
||||||
[#-- @ftlvariable name="fileTree" type="java.lang.String" --]
|
[#-- @ftlvariable name="fileTree" type="java.lang.String" --]
|
||||||
[#-- @ftlvariable name="baseUrl" type="java.lang.String" --]
|
[#-- @ftlvariable name="baseUrl" type="java.lang.String" --]
|
||||||
[#-- @ftlvariable name="imgUrls" type="String" --]
|
[#-- @ftlvariable name="imgUrls" type="String" --]
|
||||||
|
|||||||
@ -275,7 +275,7 @@ public class FileHandlerService {
|
|||||||
attribute.setUrl(url);
|
attribute.setUrl(url);
|
||||||
if (req != null) {
|
if (req != null) {
|
||||||
String officePreviewType = req.getParameter("officePreviewType");
|
String officePreviewType = req.getParameter("officePreviewType");
|
||||||
String fileKey = req.getParameter("fileKey");
|
String fileKey = WebUtils.getUrlParameterReg(url,"fileKey");
|
||||||
if (StringUtils.hasText(officePreviewType)) {
|
if (StringUtils.hasText(officePreviewType)) {
|
||||||
attribute.setOfficePreviewType(officePreviewType);
|
attribute.setOfficePreviewType(officePreviewType);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,8 @@ public interface FilePreview {
|
|||||||
String OFFICE_PICTURE_FILE_PREVIEW_PAGE = "officePicture";
|
String OFFICE_PICTURE_FILE_PREVIEW_PAGE = "officePicture";
|
||||||
String TXT_FILE_PREVIEW_PAGE = "txt";
|
String TXT_FILE_PREVIEW_PAGE = "txt";
|
||||||
String EXEL_FILE_PREVIEW_PAGE = "html";
|
String EXEL_FILE_PREVIEW_PAGE = "html";
|
||||||
|
String XML_FILE_PREVIEW_PAGE = "xml";
|
||||||
|
String MARKDOWN_FILE_PREVIEW_PAGE = "markdown";
|
||||||
String NOT_SUPPORTED_FILE_PAGE = "fileNotSupported";
|
String NOT_SUPPORTED_FILE_PAGE = "fileNotSupported";
|
||||||
|
|
||||||
String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);
|
String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);
|
||||||
|
|||||||
@ -5,8 +5,6 @@ import cn.keking.service.FilePreview;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
|
||||||
import static cn.keking.service.impl.SimTextFilePreviewImpl.TEXT_TYPE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kl (http://kailing.pub)
|
* @author kl (http://kailing.pub)
|
||||||
* @since 2020/12/25
|
* @since 2020/12/25
|
||||||
@ -23,7 +21,7 @@ public class MarkdownFilePreviewImpl implements FilePreview {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||||
model.addAttribute(TEXT_TYPE,"markdown");
|
simTextFilePreview.filePreviewHandle(url, model, fileAttribute);
|
||||||
return simTextFilePreview.filePreviewHandle(url, model, fileAttribute);
|
return MARKDOWN_FILE_PREVIEW_PAGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,9 +20,6 @@ import java.nio.charset.StandardCharsets;
|
|||||||
@Service
|
@Service
|
||||||
public class SimTextFilePreviewImpl implements FilePreview {
|
public class SimTextFilePreviewImpl implements FilePreview {
|
||||||
|
|
||||||
public static final String TEXT_TYPE = "textType";
|
|
||||||
public static final String DEFAULT_TEXT_TYPE = "simText";
|
|
||||||
|
|
||||||
private final OtherFilePreviewImpl otherFilePreview;
|
private final OtherFilePreviewImpl otherFilePreview;
|
||||||
|
|
||||||
public SimTextFilePreviewImpl(OtherFilePreviewImpl otherFilePreview) {
|
public SimTextFilePreviewImpl(OtherFilePreviewImpl otherFilePreview) {
|
||||||
@ -43,9 +40,6 @@ public class SimTextFilePreviewImpl implements FilePreview {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return otherFilePreview.notSupportedFile(model, fileAttribute, e.getLocalizedMessage());
|
return otherFilePreview.notSupportedFile(model, fileAttribute, e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
if (!model.containsAttribute(TEXT_TYPE)) {
|
|
||||||
model.addAttribute(TEXT_TYPE, DEFAULT_TEXT_TYPE);
|
|
||||||
}
|
|
||||||
return TXT_FILE_PREVIEW_PAGE;
|
return TXT_FILE_PREVIEW_PAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,8 +5,6 @@ import cn.keking.service.FilePreview;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
|
||||||
import static cn.keking.service.impl.SimTextFilePreviewImpl.TEXT_TYPE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kl (http://kailing.pub)
|
* @author kl (http://kailing.pub)
|
||||||
* @since 2020/12/25
|
* @since 2020/12/25
|
||||||
@ -22,7 +20,7 @@ public class XmlFilePreviewImpl implements FilePreview {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
|
||||||
model.addAttribute(TEXT_TYPE,"xml");
|
simTextFilePreview.filePreviewHandle(url, model, fileAttribute);
|
||||||
return simTextFilePreview.filePreviewHandle(url, model, fileAttribute);
|
return XML_FILE_PREVIEW_PAGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@ public class OnlinePreviewController {
|
|||||||
return otherFilePreview.notSupportedFile(model, errorMsg);
|
return otherFilePreview.notSupportedFile(model, errorMsg);
|
||||||
}
|
}
|
||||||
FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req);
|
FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req);
|
||||||
|
model.addAttribute("file", fileAttribute);
|
||||||
FilePreview filePreview = previewFactory.get(fileAttribute);
|
FilePreview filePreview = previewFactory.get(fileAttribute);
|
||||||
logger.info("预览文件url:{},previewType:{}", fileUrl, fileAttribute.getType());
|
logger.info("预览文件url:{},previewType:{}", fileUrl, fileAttribute.getType());
|
||||||
return filePreview.filePreviewHandle(fileUrl, model, fileAttribute);
|
return filePreview.filePreviewHandle(fileUrl, model, fileAttribute);
|
||||||
|
|||||||
49
server/src/main/resources/web/commonHeader.ftl
Normal file
49
server/src/main/resources/web/commonHeader.ftl
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"/>
|
||||||
|
<script src="js/jquery-3.0.0.min.js" type="text/javascript"></script>
|
||||||
|
<script src="js/jquery.form.min.js" type="text/javascript"></script>
|
||||||
|
<script src="bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
|
||||||
|
<script src="js/watermark.js" type="text/javascript"></script>
|
||||||
|
<script src="js/base64.min.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* 初始化水印
|
||||||
|
*/
|
||||||
|
function initWaterMark() {
|
||||||
|
let watermarkTxt = '${watermarkTxt}';
|
||||||
|
if (watermarkTxt !== '') {
|
||||||
|
watermark.init({
|
||||||
|
watermark_txt: '${watermarkTxt}',
|
||||||
|
watermark_x: 0,
|
||||||
|
watermark_y: 0,
|
||||||
|
watermark_rows: 0,
|
||||||
|
watermark_cols: 0,
|
||||||
|
watermark_x_space: ${watermarkXSpace},
|
||||||
|
watermark_y_space: ${watermarkYSpace},
|
||||||
|
watermark_font: '${watermarkFont}',
|
||||||
|
watermark_fontsize: '${watermarkFontsize}',
|
||||||
|
watermark_color: '${watermarkColor}',
|
||||||
|
watermark_alpha: ${watermarkAlpha},
|
||||||
|
watermark_width: ${watermarkWidth},
|
||||||
|
watermark_height: ${watermarkHeight},
|
||||||
|
watermark_angle: ${watermarkAngle},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
@ -5,15 +5,8 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
<link href="css/zTreeStyle.css" rel="stylesheet" type="text/css">
|
<link href="css/zTreeStyle.css" rel="stylesheet" type="text/css">
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
body {
|
body {
|
||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
}
|
}
|
||||||
@ -32,10 +25,7 @@
|
|||||||
<div class="zTreeDemoBackground left">
|
<div class="zTreeDemoBackground left">
|
||||||
<ul id="treeDemo" class="ztree"></ul>
|
<ul id="treeDemo" class="ztree"></ul>
|
||||||
</div>
|
</div>
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery-3.0.0.min.js"></script>
|
|
||||||
<script type="text/javascript" src="js/jquery.ztree.core.js"></script>
|
<script type="text/javascript" src="js/jquery.ztree.core.js"></script>
|
||||||
<script type="text/javascript" src="js/base64.min.js" ></script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
const data = JSON.parse('${fileTree}');
|
const data = JSON.parse('${fileTree}');
|
||||||
@ -87,25 +77,7 @@
|
|||||||
|
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<img src="images/sorry.jpg" />
|
<img src="images/sorry.jpg" />
|
||||||
<span>
|
<span>
|
||||||
该文件类型(${fileType})系统暂时不支持在线预览,<b>说明</b>:
|
该文件类型(${file.suffix})系统暂时不支持在线预览,<b>说明</b>:
|
||||||
<p style="color: red;">${msg}</p>
|
<p style="color: red;">${msg}</p>
|
||||||
有任何疑问,请加 <a href="https://jq.qq.com/?_wv=1027&k=5c0UAtu">官方QQ群:613025121</a> 咨询
|
有任何疑问,请加 <a href="https://jq.qq.com/?_wv=1027&k=5c0UAtu">官方QQ群:613025121</a> 咨询
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@ -3,18 +3,10 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>多媒体文件预览</title>
|
<title>多媒体文件预览</title>
|
||||||
<script src="js/flv.min.js"type="text/javascript"></script>
|
<script src="js/flv.min.js" type="text/javascript"></script>
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
<#include "*/commonHeader.ftl">
|
||||||
</head>
|
</head>
|
||||||
<style>
|
<style>
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
body {
|
body {
|
||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
}
|
}
|
||||||
@ -40,25 +32,7 @@
|
|||||||
}
|
}
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -4,21 +4,11 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
<style type="text/css">
|
<#include "*/commonHeader.ftl">
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<iframe src="${pdfUrl}" width="100%" frameborder="0"></iframe>
|
<iframe src="${pdfUrl}" width="100%" frameborder="0"></iframe>
|
||||||
</body>
|
</body>
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
document.getElementsByTagName('iframe')[0].height = document.documentElement.clientHeight-10;
|
document.getElementsByTagName('iframe')[0].height = document.documentElement.clientHeight-10;
|
||||||
/**
|
/**
|
||||||
@ -30,25 +20,7 @@
|
|||||||
}
|
}
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
@ -2,51 +2,49 @@
|
|||||||
|
|
||||||
<html lang="en">
|
<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" />
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0"/>
|
||||||
<title>kkFileView演示首页</title>
|
<title>kkFileView演示首页</title>
|
||||||
<link rel="stylesheet" href="css/viewer.min.css" />
|
<link rel="stylesheet" href="css/viewer.min.css"/>
|
||||||
<link rel="stylesheet" href="css/loading.css" />
|
<link rel="stylesheet" href="css/loading.css"/>
|
||||||
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
|
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"/>
|
||||||
<link rel="stylesheet" href="bootstrap-table/bootstrap-table.min.css" />
|
<link rel="stylesheet" href="bootstrap-table/bootstrap-table.min.css"/>
|
||||||
<link rel="stylesheet" href="gitalk/gitalk.css" />
|
<link rel="stylesheet" href="gitalk/gitalk.css"/>
|
||||||
<script type="text/javascript" src="js/jquery-3.0.0.min.js"></script>
|
<script type="text/javascript" src="js/jquery-3.0.0.min.js"></script>
|
||||||
<script type="text/javascript" src="js/jquery.form.min.js"></script>
|
<script type="text/javascript" src="js/jquery.form.min.js"></script>
|
||||||
<script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script>
|
<script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script>
|
||||||
<script type="text/javascript" src="bootstrap-table/bootstrap-table.min.js"></script>
|
<script type="text/javascript" src="bootstrap-table/bootstrap-table.min.js"></script>
|
||||||
<script type="text/javascript" src="gitalk/gitalk.min.js"></script>
|
<script type="text/javascript" src="gitalk/gitalk.min.js"></script>
|
||||||
<script type="text/javascript" src="js/base64.min.js" ></script>
|
<script type="text/javascript" src="js/base64.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>文件预览项目接入和测试界面</h1>
|
<div class="panel-group container" id="accordion">
|
||||||
<div class="panel-group" id="accordion">
|
<h1>文件预览项目接入和测试界面</h1>
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a data-toggle="collapse" data-parent="#accordion"
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||||
href="#collapseOne">
|
|
||||||
接入说明
|
接入说明
|
||||||
</a>
|
</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapseOne" class="panel-collapse collapse">
|
<div class="panel-body">
|
||||||
<div class="panel-body">
|
<div>
|
||||||
<div>
|
如果你的项目需要接入文件预览项目,达到对docx、excel、ppt、jpg等文件的预览效果,那么通过在你的项目中加入下面的代码就可以
|
||||||
如果你的项目需要接入文件预览项目,达到对docx、excel、ppt、jpg等文件的预览效果,那么通过在你的项目中加入下面的代码就可以
|
成功实现:
|
||||||
成功实现:
|
<pre style="background-color: #2f332a;color: #cccccc">
|
||||||
<pre style="background-color: #2f332a;color: #cccccc">
|
var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址
|
||||||
var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址
|
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(base64Encode(url)));
|
||||||
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(base64Encode(url)));
|
</pre>
|
||||||
</pre>
|
</div>
|
||||||
</div>
|
<div>
|
||||||
<div>
|
新增多图片同时预览功能,接口如下:
|
||||||
新增多图片同时预览功能,接口如下:
|
<pre style="background-color: #2f332a;color: #cccccc">
|
||||||
<pre style="background-color: #2f332a;color: #cccccc">
|
var fileUrl =url1+"|"+"url2";//多文件使用“|”字符隔开
|
||||||
var fileUrl =url1+"|"+"url2";//多文件使用“|”字符隔开
|
window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(base64Encode(fileUrl)));
|
||||||
window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(base64Encode(fileUrl)));
|
</pre>
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -59,104 +57,100 @@ window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(bas
|
|||||||
</a>
|
</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapseTwo" class="panel-collapse collapse">
|
<div class="panel-body">
|
||||||
<div class="panel-body">
|
<div style="padding: 10px">
|
||||||
<div style="padding: 10px">
|
<form enctype="multipart/form-data" id="fileUpload">
|
||||||
<form enctype="multipart/form-data" id="fileUpload">
|
<input type="file" name="file"/>
|
||||||
<input type="file" name="file" />
|
<input type="button" id="btnSubmit" value=" 上 传 "/>
|
||||||
<input type="button" id="btnsubmit" value=" 上 传 " />
|
</form>
|
||||||
</form>
|
</div>
|
||||||
</div>
|
<div>
|
||||||
<div>
|
<table id="table" data-pagination="true"></table>
|
||||||
<table id="table" data-pagination="true"></table>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
<a data-toggle="collapse" data-parent="#accordion"
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseThree">
|
||||||
href="#collapseThree">
|
发版记录
|
||||||
更新记录
|
|
||||||
</a>
|
</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="collapseThree" class="panel-collapse collapse in">
|
<div class="panel-body">
|
||||||
<div class="panel-body">
|
<div>
|
||||||
<div>
|
2020年12月27日 :<br>
|
||||||
2020年12月27日 :<br>
|
2020年年终大版本更新,架构全面设计,代码全面重构,代码质量全面提升,二次开发更便捷,欢迎拉源码品鉴,提issue、pr共同建设<br>
|
||||||
2020年年终大版本更新,架构全面设计,代码全面重构,代码质量全面提升,二次开发更便捷,欢迎拉源码品鉴,提issue、pr共同建设
|
1. 架构模块调整,大量的代码重构,代码质量提升N个等级,欢迎品鉴<br>
|
||||||
1. 架构模块调整,大量的代码重构,代码质量提升N个等级,欢迎品鉴<br>
|
2. 增强XML文件预览效果,新增XML文档数结构预览<br>
|
||||||
2. 增强XML文件预览效果,新增XML文档数结构预览<br>
|
3. 新增markdown文件预览支持,预览支持md渲染和源文本切换支持<br>
|
||||||
3. 新增markdown文件预览支持,预览支持md渲染和源文本切换支持<br>
|
4. 切换底层web server为jetty,解决这个issue:<a href="https://github.com/kekingcn/kkFileView/issues/168">#issues/168</a><br>
|
||||||
4. 切换底层web server为jetty,解决这个issue:<a href="https://github.com/kekingcn/kkFileView/issues/168">#issues/168</a><br>
|
5. 引入cpdetector,解决文件编码识别问题<br>
|
||||||
5. 引入cpdetector,解决文件编码识别问题<br>
|
6. url采用base64+urlencode双编码,彻底解决各种奇葩文件名预览问题<br>
|
||||||
6. url采用base64+urlencode双编码,彻底解决各种奇葩文件名预览问题<br>
|
7. 新增配置项office.preview.switch.disabled,控制offic文件预览切换开关<br>
|
||||||
7. 新增配置项office.preview.switch.disabled,控制offic文件预览切换开关<br>
|
8. 优化文本类型文件预览逻辑,采用Base64传输内容,避免预览时再次请求文件内容<br>
|
||||||
8. 优化文本类型文件预览逻辑,采用Base64传输内容,避免预览时再次请求文件内容<br>
|
9. office预览图片模式禁用图片放大效果,达到图片和pdf预览效果一致的体验<br>
|
||||||
9. office预览图片模式禁用图片放大效果,达到图片和pdf预览效果一致的体验<br>
|
10. 直接代码静态设置pdfbox兼容低版本jdk,在IDEA中运行也不会有警告提示<br>
|
||||||
10. 直接代码静态设置pdfbox兼容低版本jdk,在IDEA中运行也不会有警告提示<br>
|
11. 移除guava、hutool等非必须的工具包,减少代码体积<br>
|
||||||
11. 移除guava、hutool等非必须的工具包,减少代码体积<br>
|
12. Office组件加载异步化,提速应用启动速度最快到5秒内<br>
|
||||||
12. Office组件加载异步化,提速应用启动速度最快到5秒内<br>
|
13. 合理设置预览消费队列的线程数<br>
|
||||||
13. 合理设置预览消费队列的线程数<br>
|
14. 修复压缩包里文件再次预览失败的bug<br>
|
||||||
14. 修复压缩包里文件再次预览失败的bug<br>
|
15. 修复图片预览的bug<br><br>
|
||||||
15. 修复图片预览的bug<br><br>
|
|
||||||
|
|
||||||
2020年05月20日 :<br>
|
2020年05月20日 :<br>
|
||||||
1. 新增支持全局水印,并支持通过参数动态改变水印内容<br>
|
1. 新增支持全局水印,并支持通过参数动态改变水印内容<br>
|
||||||
2. 新增支持CAD文件预览<br>
|
2. 新增支持CAD文件预览<br>
|
||||||
3. 新增base.url配置,支持使用nginx反向代理和使用context-path<br>
|
3. 新增base.url配置,支持使用nginx反向代理和使用context-path<br>
|
||||||
4. 支持所有配置项支持从环境变量里读取,方便Docker镜像部署和集群中大规模使用<br>
|
4. 支持所有配置项支持从环境变量里读取,方便Docker镜像部署和集群中大规模使用<br>
|
||||||
5. 支持配置限信任站点(只能预览来自信任点的文件源),保护预览服务不被滥用<br>
|
5. 支持配置限信任站点(只能预览来自信任点的文件源),保护预览服务不被滥用<br>
|
||||||
6. 支持配置自定义缓存清理时间(cron表达式)<br>
|
6. 支持配置自定义缓存清理时间(cron表达式)<br>
|
||||||
7. 全部能识别的纯文本直接预览,不用再转跳下载,如.md .java .py等<br>
|
7. 全部能识别的纯文本直接预览,不用再转跳下载,如.md .java .py等<br>
|
||||||
8. 支持配置限制转换后的PDF文件下载<br>
|
8. 支持配置限制转换后的PDF文件下载<br>
|
||||||
9. 优化maven打包配置,解决 .sh 脚本可能出现换行符问题<br>
|
9. 优化maven打包配置,解决 .sh 脚本可能出现换行符问题<br>
|
||||||
10. 将前端所有CDN依赖放到本地,方便没有外网连接的用户使用<br>
|
10. 将前端所有CDN依赖放到本地,方便没有外网连接的用户使用<br>
|
||||||
11. 首页评论服务由搜狐畅言切换到Gitalk<br>
|
11. 首页评论服务由搜狐畅言切换到Gitalk<br>
|
||||||
12. 修复url中包含特殊字符可能会引起的预览异常<br>
|
12. 修复url中包含特殊字符可能会引起的预览异常<br>
|
||||||
13. 修复转换文件队列addTask异常<br>
|
13. 修复转换文件队列addTask异常<br>
|
||||||
14. 修复其他已经问题<br>
|
14. 修复其他已经问题<br>
|
||||||
15. 官网建设:<a href="https://kkfileview.keking.cn">https://kkfileview.keking.cn</a><br>
|
15. 官网建设:<a href="https://kkfileview.keking.cn">https://kkfileview.keking.cn</a><br>
|
||||||
16. 官方Docker镜像仓库建设:<a href="https://hub.docker.com/r/keking/kkfileview">https://hub.docker.com/r/keking/kkfileview</a><br><br>
|
16. 官方Docker镜像仓库建设:<a href="https://hub.docker.com/r/keking/kkfileview">https://hub.docker.com/r/keking/kkfileview</a><br><br>
|
||||||
|
|
||||||
2019年06月18日 :<br>
|
2019年06月18日 :<br>
|
||||||
1. 支持自动清理缓存及预览文件<br>
|
1. 支持自动清理缓存及预览文件<br>
|
||||||
2. 支持http/https下载流url文件预览<br>
|
2. 支持http/https下载流url文件预览<br>
|
||||||
3. 支持FTP url文件预览<br>
|
3. 支持FTP url文件预览<br>
|
||||||
4. 加入Docker构建<br><br>
|
4. 加入Docker构建<br><br>
|
||||||
|
|
||||||
2019年04月08日 :<br>
|
2019年04月08日 :<br>
|
||||||
1. 缓存及队列实现抽象,提供JDK和REDIS两种实现(REDIS成为可选依赖)<br>
|
1. 缓存及队列实现抽象,提供JDK和REDIS两种实现(REDIS成为可选依赖)<br>
|
||||||
2. 打包方式提供zip和tar.gz包,并提供一键启动脚本<br><br>
|
2. 打包方式提供zip和tar.gz包,并提供一键启动脚本<br><br>
|
||||||
|
|
||||||
2018年01月19日 :<br>
|
2018年01月19日 :<br>
|
||||||
1. 大文件入队提前处理<br>
|
1. 大文件入队提前处理<br>
|
||||||
1. 新增addTask文件转换入队接口<br>
|
1. 新增addTask文件转换入队接口<br>
|
||||||
1. 采用redis队列,支持kkFIleView接口和异构系统入队两种方式<br><br>
|
1. 采用redis队列,支持kkFIleView接口和异构系统入队两种方式<br><br>
|
||||||
|
|
||||||
2018年01月15日 :<br>
|
2018年01月15日 :<br>
|
||||||
1.首页新增社会化评论框<br><br>
|
1.首页新增社会化评论框<br><br>
|
||||||
|
|
||||||
2018年01月12日 :<br>
|
2018年01月12日 :<br>
|
||||||
1.新增多图片同时预览<br>
|
1.新增多图片同时预览<br>
|
||||||
2.支持压缩包内图片轮番预览<br><br>
|
2.支持压缩包内图片轮番预览<br><br>
|
||||||
|
|
||||||
2018年01月02日 :<br>
|
2018年01月02日 :<br>
|
||||||
1.修复txt等文本编码问题导致预览乱码<br>
|
1.修复txt等文本编码问题导致预览乱码<br>
|
||||||
2.修复项目模块依赖引入不到的问题<br>
|
2.修复项目模块依赖引入不到的问题<br>
|
||||||
3.新增spring boot profile,支持多环境配置<br>
|
3.新增spring boot profile,支持多环境配置<br>
|
||||||
4.引入pdf.js预览doc等文件,支持doc标题生成pdf预览菜单,支持手机端预览<br><br>
|
4.引入pdf.js预览doc等文件,支持doc标题生成pdf预览菜单,支持手机端预览<br><br>
|
||||||
|
|
||||||
2017年12月12日:<br>
|
2017年12月12日:<br>
|
||||||
1.项目gitee开源:<a href="https://gitee.com/kekingcn/file-online-preview" target="_blank">https://gitee.com/kekingcn/file-online-preview</a><br>
|
1.项目gitee开源:<a href="https://gitee.com/kekingcn/file-online-preview" target="_blank">https://gitee.com/kekingcn/file-online-preview</a><br>
|
||||||
2.项目github开源:<a href="https://github.com/kekingcn/kkFileView" target="_blank">https://github.com/kekingcn/kkFileView</a>
|
2.项目github开源:<a href="https://github.com/kekingcn/kkFileView" target="_blank">https://github.com/kekingcn/kkFileView</a>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div id = "comments"></div>
|
<div id="comments"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -190,9 +184,9 @@ window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(bas
|
|||||||
url: '${baseUrl}deleteFile?fileName=' + encodeURIComponent(fileName),
|
url: '${baseUrl}deleteFile?fileName=' + encodeURIComponent(fileName),
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
// 删除完成,刷新table
|
// 删除完成,刷新table
|
||||||
if (1 == data.code) {
|
if (1 === data.code) {
|
||||||
alert(data.msg);
|
alert(data.msg);
|
||||||
} else{
|
} else {
|
||||||
$('#table').bootstrapTable('refresh', {});
|
$('#table').bootstrapTable('refresh', {});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -201,6 +195,7 @@ window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(bas
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
$('#table').bootstrapTable({
|
$('#table').bootstrapTable({
|
||||||
url: 'listFiles',
|
url: 'listFiles',
|
||||||
@ -211,14 +206,14 @@ window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(bas
|
|||||||
field: 'action',
|
field: 'action',
|
||||||
title: '操作'
|
title: '操作'
|
||||||
},]
|
},]
|
||||||
}).on('pre-body.bs.table', function (e,data) {
|
}).on('pre-body.bs.table', function (e, data) {
|
||||||
// 每个data添加一列用来操作
|
// 每个data添加一列用来操作
|
||||||
$(data).each(function (index, item) {
|
$(data).each(function (index, item) {
|
||||||
item.action = "<a class='btn btn-default' target='_blank' href='${baseUrl}onlinePreview?url="+ encodeURIComponent(Base64.encode('${baseUrl}' + item.fileName)) +"'>预览</a>" +
|
item.action = "<a class='btn btn-default' target='_blank' href='${baseUrl}onlinePreview?url=" + encodeURIComponent(Base64.encode('${baseUrl}' + item.fileName)) + "'>预览</a>" +
|
||||||
"<a class='btn btn-default' href='javascript:void(0);' onclick='deleteFile(\""+item.fileName+"\")'>删除</a>";
|
"<a class='btn btn-default' href='javascript:void(0);' onclick='deleteFile(\"" + item.fileName + "\")'>删除</a>";
|
||||||
});
|
});
|
||||||
return data;
|
return data;
|
||||||
}).on('post-body.bs.table', function (e,data) {
|
}).on('post-body.bs.table', function (e, data) {
|
||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -228,12 +223,12 @@ window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(bas
|
|||||||
$(".loading_container").css("height", height).show();
|
$(".loading_container").css("height", height).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
$("#btnsubmit").click(function () {
|
$("#btnSubmit").click(function () {
|
||||||
showLoadingDiv();
|
showLoadingDiv();
|
||||||
$("#fileUpload").ajaxSubmit({
|
$("#fileUpload").ajaxSubmit({
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
// 上传完成,刷新table
|
// 上传完成,刷新table
|
||||||
if (1 == data.code) {
|
if (1 === data.code) {
|
||||||
alert(data.msg);
|
alert(data.msg);
|
||||||
} else {
|
} else {
|
||||||
$('#table').bootstrapTable('refresh', {});
|
$('#table').bootstrapTable('refresh', {});
|
||||||
|
|||||||
73
server/src/main/resources/web/markdown.ftl
Normal file
73
server/src/main/resources/web/markdown.ftl
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
|
<title>markdown文本预览</title>
|
||||||
|
<script src="js/marked.min.js" type="text/javascript"></script>
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<input hidden id="textData" value="${textData}"/>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div id="markdown_btn" class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||||
|
${file.name}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="text_btn" class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||||
|
${file.name}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div id="markdown"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*/
|
||||||
|
window.onload = function () {
|
||||||
|
$("#markdown_btn").hide()
|
||||||
|
initWaterMark();
|
||||||
|
loadMarkdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载markdown
|
||||||
|
*/
|
||||||
|
function loadMarkdown() {
|
||||||
|
var textData = Base64.decode($("#textData").val())
|
||||||
|
window.textPreData = "<pre style='background-color: #FFFFFF;border:none'>" + textData + "</pre>";
|
||||||
|
window.textMarkdownData = marked(textData);
|
||||||
|
$("#markdown").html(window.textMarkdownData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
$("#markdown_btn").click(function () {
|
||||||
|
$("#markdown").html(window.textMarkdownData);
|
||||||
|
$("#text_btn").show()
|
||||||
|
$("#markdown_btn").hide()
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#text_btn").click(function () {
|
||||||
|
$("#markdown_btn").show()
|
||||||
|
$("#text_btn").hide();
|
||||||
|
$("#markdown").html(window.textPreData);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@ -1,23 +1,16 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="zh-cn">
|
<html lang="zh-cn">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8"/>
|
||||||
<title>多媒体文件预览</title>
|
<title>多媒体文件预览</title>
|
||||||
<link rel="stylesheet" href="plyr/plyr.css" />
|
<link rel="stylesheet" href="plyr/plyr.css"/>
|
||||||
<script type="text/javascript" src="plyr/plyr.js"></script>
|
<script type="text/javascript" src="plyr/plyr.js"></script>
|
||||||
<script type="text/javascript" src="js/watermark.js"></script>
|
<#include "*/commonHeader.ftl">
|
||||||
<style>
|
<style>
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
body {
|
body {
|
||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
}
|
}
|
||||||
|
|
||||||
.m {
|
.m {
|
||||||
width: 1024px;
|
width: 1024px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
@ -27,31 +20,13 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="m">
|
<div class="m">
|
||||||
<video>
|
<video>
|
||||||
<source src="${mediaUrl}" />
|
<source src="${mediaUrl}"/>
|
||||||
</video>
|
</video>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
plyr.setup();
|
plyr.setup();
|
||||||
window.onload = function() {
|
window.onload = function () {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -4,15 +4,8 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>PDF图片预览</title>
|
<title>PDF图片预览</title>
|
||||||
<script src="js/lazyload.js"></script>
|
<script src="js/lazyload.js"></script>
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
<style>
|
<style>
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
body {
|
body {
|
||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
}
|
}
|
||||||
@ -37,29 +30,10 @@
|
|||||||
<#if "false" == switchDisabled>
|
<#if "false" == switchDisabled>
|
||||||
<img src="images/pdf.svg" width="63" height="63" style="position: fixed; cursor: pointer; top: 40%; right: 48px; z-index: 999;" alt="使用PDF预览" title="使用PDF预览" onclick="changePreviewType('pdf')"/>
|
<img src="images/pdf.svg" width="63" height="63" style="position: fixed; cursor: pointer; top: 40%; right: 48px; z-index: 999;" alt="使用PDF预览" title="使用PDF预览" onclick="changePreviewType('pdf')"/>
|
||||||
</#if>
|
</#if>
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script>
|
<script>
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
checkImgs();
|
checkImgs();
|
||||||
};
|
};
|
||||||
window.onscroll = throttle(checkImgs);
|
window.onscroll = throttle(checkImgs);
|
||||||
|
|||||||
@ -2,41 +2,33 @@
|
|||||||
|
|
||||||
<html lang="en">
|
<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">
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
<title>PDF预览</title>
|
<title>PDF预览</title>
|
||||||
<style type="text/css">
|
<#include "*/commonHeader.ftl">
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<#if pdfUrl?contains("http://") || pdfUrl?contains("https://")>
|
<#if pdfUrl?contains("http://") || pdfUrl?contains("https://")>
|
||||||
<#assign finalUrl="${pdfUrl}">
|
<#assign finalUrl="${pdfUrl}">
|
||||||
<#else>
|
<#else>
|
||||||
<#assign finalUrl="${baseUrl}${pdfUrl}">
|
<#assign finalUrl="${baseUrl}${pdfUrl}">
|
||||||
</#if>
|
</#if>
|
||||||
<iframe src="" width="100%" frameborder="0"></iframe>
|
<iframe src="" width="100%" frameborder="0"></iframe>
|
||||||
<#if "false" == switchDisabled>
|
<#if "false" == switchDisabled>
|
||||||
<img src="images/jpg.svg" width="63" height="63" style="position: fixed; cursor: pointer; top: 40%; right: 48px; z-index: 999;" alt="使用图片预览" title="使用图片预览" onclick="goForImage()"/>
|
<img src="images/jpg.svg" width="63" height="63"
|
||||||
</#if>
|
style="position: fixed; cursor: pointer; top: 40%; right: 48px; z-index: 999;" alt="使用图片预览" title="使用图片预览"
|
||||||
|
onclick="goForImage()"/>
|
||||||
|
</#if>
|
||||||
</body>
|
</body>
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
document.getElementsByTagName('iframe')[0].src = "${baseUrl}pdfjs/web/viewer.html?base=${baseUrl}&file="+encodeURIComponent('${finalUrl}')+"&disabledownload=${pdfDownloadDisable}";
|
document.getElementsByTagName('iframe')[0].src = "${baseUrl}pdfjs/web/viewer.html?base=${baseUrl}&file=" + encodeURIComponent('${finalUrl}') + "&disabledownload=${pdfDownloadDisable}";
|
||||||
document.getElementsByTagName('iframe')[0].height = document.documentElement.clientHeight-10;
|
document.getElementsByTagName('iframe')[0].height = document.documentElement.clientHeight - 10;
|
||||||
/**
|
/**
|
||||||
* 页面变化调整高度
|
* 页面变化调整高度
|
||||||
*/
|
*/
|
||||||
window.onresize = function(){
|
window.onresize = function () {
|
||||||
var fm = document.getElementsByTagName("iframe")[0];
|
var fm = document.getElementsByTagName("iframe")[0];
|
||||||
fm.height = window.document.documentElement.clientHeight-10;
|
fm.height = window.document.documentElement.clientHeight - 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
function goForImage() {
|
function goForImage() {
|
||||||
@ -46,29 +38,12 @@
|
|||||||
} else {
|
} else {
|
||||||
url = url + "&officePreviewType=image";
|
url = url + "&officePreviewType=image";
|
||||||
}
|
}
|
||||||
window.location.href=url;
|
window.location.href = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
window.onload = function() {
|
window.onload = function () {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
@ -4,25 +4,20 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>图片预览</title>
|
<title>图片预览</title>
|
||||||
<link rel="stylesheet" href="css/viewer.min.css">
|
<link rel="stylesheet" href="css/viewer.min.css">
|
||||||
|
<script src="js/viewer.min.js"></script>
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
<style>
|
<style>
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
body {
|
body {
|
||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
}
|
}
|
||||||
#dowebok { width: 800px; margin: 0 auto; font-size: 0;}
|
#image { width: 800px; margin: 0 auto; font-size: 0;}
|
||||||
#dowebok li { display: inline-block;width: 50px;height: 50px; margin-left: 1%; padding-top: 1%;}
|
#image li { display: inline-block;width: 50px;height: 50px; margin-left: 1%; padding-top: 1%;}
|
||||||
/*#dowebok li img { width: 200%;}*/
|
/*#dowebok li img { width: 200%;}*/
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<ul id="dowebok">
|
|
||||||
|
<ul id="image">
|
||||||
<#list imgUrls as img>
|
<#list imgUrls as img>
|
||||||
<#if img?contains("http://") || img?contains("https://")>
|
<#if img?contains("http://") || img?contains("https://")>
|
||||||
<#assign img="${img}">
|
<#assign img="${img}">
|
||||||
@ -32,11 +27,9 @@
|
|||||||
<li><img id="${img}" url="${img}" src="${img}" width="1px" height="1px"></li>
|
<li><img id="${img}" url="${img}" src="${img}" width="1px" height="1px"></li>
|
||||||
</#list>
|
</#list>
|
||||||
</ul>
|
</ul>
|
||||||
<script src="js/jquery-3.0.0.min.js"></script>
|
|
||||||
<script src="js/viewer.min.js"></script>
|
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script>
|
<script>
|
||||||
var viewer = new Viewer(document.getElementById('dowebok'), {
|
var viewer = new Viewer(document.getElementById('image'), {
|
||||||
url: 'src',
|
url: 'src',
|
||||||
navbar: false,
|
navbar: false,
|
||||||
button: false,
|
button: false,
|
||||||
@ -44,61 +37,10 @@
|
|||||||
loop : true
|
loop : true
|
||||||
});
|
});
|
||||||
document.getElementById("${currentUrl}").click();
|
document.getElementById("${currentUrl}").click();
|
||||||
// 修改下一页按钮的样式和位置
|
|
||||||
$(function () {
|
|
||||||
var outHandler = function(){
|
|
||||||
$(this).css('background-color','rgba(0, 0, 0, 0)');
|
|
||||||
};
|
|
||||||
var overHandler = function(){
|
|
||||||
$(this).css('background-color','rgba(0, 0, 0, .5)');
|
|
||||||
};
|
|
||||||
var next = $("li[data-action=next]");
|
|
||||||
var prev = $("li[data-action=prev]");
|
|
||||||
var viewerToolBar = $(".viewer-footer");
|
|
||||||
// 覆盖按钮父类原始样式
|
|
||||||
viewerToolBar.css("overflow", "visible");
|
|
||||||
// 获取文档高度、宽度
|
|
||||||
var clientHeight = window.innerHeight;
|
|
||||||
var clientWidth = window.innerWidth;
|
|
||||||
// 调整样式
|
|
||||||
var styleCss = {},nextCss={},prevCss={};
|
|
||||||
styleCss.position = "absolute";
|
|
||||||
styleCss.top = -clientHeight;
|
|
||||||
styleCss.width = clientWidth*0.1;
|
|
||||||
styleCss.height = clientHeight + 52;
|
|
||||||
// 覆盖原始样式
|
|
||||||
styleCss.backgroundColor='rgba(0, 0, 0, 0)';
|
|
||||||
styleCss.borderRadius='inherit';
|
|
||||||
nextCss.right = "0";
|
|
||||||
prevCss.left = "0";
|
|
||||||
next.css($.extend(nextCss, styleCss));
|
|
||||||
prev.css($.extend(prevCss, styleCss));
|
|
||||||
next.on('mouseout',outHandler);
|
|
||||||
next.on('mouseover',overHandler);
|
|
||||||
prev.on('mouseout',outHandler);
|
|
||||||
prev.on('mouseover',overHandler);
|
|
||||||
});
|
|
||||||
/*初始化水印*/
|
/*初始化水印*/
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
var watermarkTxt = '${watermarkTxt}';
|
initWaterMark();
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color:'${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -4,144 +4,49 @@
|
|||||||
<meta charset="utf-8"/>
|
<meta charset="utf-8"/>
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
<title>普通文本预览</title>
|
<title>普通文本预览</title>
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<input hidden id="textType" value="${textType}"/>
|
|
||||||
<input hidden id="textData" value="${textData}"/>
|
<input hidden id="textData" value="${textData}"/>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<#if textType?? && textType == "markdown">
|
<div class="panel panel-default">
|
||||||
<p>
|
<div class="panel-heading">
|
||||||
<button id="markdown_btn" type="button" class="btn btn-primary">切换markdown</button>
|
<h4 class="panel-title">
|
||||||
<button id="text_btn" type="button" class="btn btn-primary">切换text</button>
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||||
</p>
|
${file.name}
|
||||||
<div id="markdown" style="padding: 18px;"></div>
|
</a>
|
||||||
<#elseif textType?? && textType == "xml" >
|
</h4>
|
||||||
<div id="xml" style="padding: 18px;"></div>
|
</div>
|
||||||
<#else>
|
<div class="panel-body">
|
||||||
<div id="text"></div>
|
<div id="text"></div>
|
||||||
</#if>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/xmlTreeViewer.css"/>
|
|
||||||
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"/>
|
|
||||||
|
|
||||||
<script src="js/jquery-3.0.0.min.js" type="text/javascript"></script>
|
|
||||||
<script src="js/jquery.form.min.js" type="text/javascript"></script>
|
|
||||||
<script src="bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
|
|
||||||
<script src="js/watermark.js" type="text/javascript"></script>
|
|
||||||
<script src="js/marked.min.js" type="text/javascript"></script>
|
|
||||||
<script src="js/xmlTreeViewer.js" type="text/javascript"></script>
|
|
||||||
<script src="js/base64.min.js" type="text/javascript"></script>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
/**
|
/**
|
||||||
* 初始化
|
* 初始化
|
||||||
*/
|
*/
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
$("#markdown_btn").hide()
|
|
||||||
initWaterMark();
|
initWaterMark();
|
||||||
fetchData();
|
|
||||||
loadText();
|
loadText();
|
||||||
loadXmlData()
|
|
||||||
loadMarkdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化水印
|
|
||||||
*/
|
|
||||||
function initWaterMark() {
|
|
||||||
let watermarkTxt = '${watermarkTxt}';
|
|
||||||
if (watermarkTxt !== '') {
|
|
||||||
watermark.init({
|
|
||||||
watermark_txt: '${watermarkTxt}',
|
|
||||||
watermark_x: 0,
|
|
||||||
watermark_y: 0,
|
|
||||||
watermark_rows: 0,
|
|
||||||
watermark_cols: 0,
|
|
||||||
watermark_x_space: ${watermarkXSpace},
|
|
||||||
watermark_y_space: ${watermarkYSpace},
|
|
||||||
watermark_font: '${watermarkFont}',
|
|
||||||
watermark_fontsize: '${watermarkFontsize}',
|
|
||||||
watermark_color: '${watermarkColor}',
|
|
||||||
watermark_alpha: ${watermarkAlpha},
|
|
||||||
watermark_width: ${watermarkWidth},
|
|
||||||
watermark_height: ${watermarkHeight},
|
|
||||||
watermark_angle: ${watermarkAngle},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取文本数据
|
|
||||||
*/
|
|
||||||
function fetchData() {
|
|
||||||
window.textData = Base64.decode($("#textData").val())
|
|
||||||
window.textPreData = "<pre>" + window.textData + "</pre>";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*加载普通文本
|
*加载普通文本
|
||||||
*/
|
*/
|
||||||
function loadText() {
|
function loadText() {
|
||||||
$("#text").html(window.textPreData);
|
var textData = Base64.decode($("#textData").val())
|
||||||
|
var textPreData = "<pre style='background-color: #FFFFFF;border:none'>" + textData + "</pre>";
|
||||||
|
|
||||||
|
$("#text").html(textPreData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载markdown
|
|
||||||
*/
|
|
||||||
function loadMarkdown() {
|
|
||||||
if ($("#textType").val() === "markdown") {
|
|
||||||
window.textMarkdownData = marked(window.textData);
|
|
||||||
$("#markdown").html(window.textMarkdownData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载xml数据
|
|
||||||
*/
|
|
||||||
function loadXmlData() {
|
|
||||||
if ($("#textType").val() === "xml") {
|
|
||||||
var xmlNode = xmlTreeViewer.parseXML(window.textData);
|
|
||||||
var retNode = xmlTreeViewer.getXMLViewerNode(xmlNode.xml);
|
|
||||||
$("#xml").html(retNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function () {
|
|
||||||
$("#markdown_btn").click(function () {
|
|
||||||
$("#markdown").html(window.textMarkdownData);
|
|
||||||
$("#text_btn").show()
|
|
||||||
$("#markdown_btn").hide()
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#text_btn").click(function () {
|
|
||||||
$("#markdown_btn").show()
|
|
||||||
$("#text_btn").hide();
|
|
||||||
$("#markdown").html(window.textPreData);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<style>
|
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#markdown, #xml {
|
|
||||||
height: 97%;
|
|
||||||
max-height: 97%;
|
|
||||||
border: 1px solid #ece7e7;
|
|
||||||
overflow-y: scroll;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
51
server/src/main/resources/web/xml.ftl
Normal file
51
server/src/main/resources/web/xml.ftl
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0">
|
||||||
|
<title>xml文本预览</title>
|
||||||
|
<#include "*/commonHeader.ftl">
|
||||||
|
<link rel="stylesheet" href="css/xmlTreeViewer.css"/>
|
||||||
|
<script src="js/xmlTreeViewer.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<input hidden id="textData" value="${textData}"/>
|
||||||
|
<div class="container">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
||||||
|
${file.name}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div id="xml"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*/
|
||||||
|
window.onload = function () {
|
||||||
|
initWaterMark();
|
||||||
|
loadXmlData()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载xml数据
|
||||||
|
*/
|
||||||
|
function loadXmlData() {
|
||||||
|
var textData = Base64.decode($("#textData").val())
|
||||||
|
var xmlNode = xmlTreeViewer.parseXML(textData);
|
||||||
|
var retNode = xmlTreeViewer.getXMLViewerNode(xmlNode.xml);
|
||||||
|
$("#xml").html(retNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user