官方文档地址:http://kkfileview.keking.cn/zh-cn/docs/production.html
源码地址:https://gitee.com/kekingcn/file-online-preview
一、方式一:docker直接拉取镜像部署
一般没有改代码的话用这种方式就可以,注意有nginx转发的话需要配置base.url参数
1. 拉取镜像4.1.0版本
docker pull keking/kkfileview:4.1.0
2. 运行
docker run -itd --name=kkfileview --volume=/data/java/kkfileview/config/application.properties:/opt/kkfileview:4.1.0/config/application.properties -p 8860:8012 kkfileview
容器内配置文件的目录在:
/opt/kkFileView-4.1.0/config/application.properties
注意:宿主机需要有/data/java/kkfileview/config/application.properties文件做映射,方便修改参数配置
二、方式二:手动部署
由于对代码做了一些更改,所以手动部署
1. 构建基础镜像
1. 上传文件到服务器
/data/java/kkfileviewbase
2. 进入目录
cd /data/java/kkfileviewbase
3. 构建基础镜像
docker build --tag kkfileview-base .
2. 代码改动
Dockerfile文件
FROM kkfileviewbase
MAINTAINER chenjh "842761733@qq.com"
ADD kkFileView-4.1.0.tar.gz /opt/
ENV KKFILEVIEW_BIN_FOLDER /opt/kkFileView-4.1.0/bin
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Dspring.config.location=/opt/kkFileView-4.1.0/config/application.properties","-jar","/opt/kkFileView-4.1.0/bin/kkFileView-4.1.0.jar"]
pom
</build>
<finalName>kkFileView-4.1.0</finalName>
</build>
3. 部署
1. 上传文件到宿主机
/data/java/kkfileview
2. 上传配置到宿主机(application.properties)
/data/java/kkfileview/config/application.properties
1. 进入目录
cd /data/java/kkfileview
2. 构建镜像
docker build -t kkfileview .
3. 启动
docker run -itd --name=kkfileview --volume=/data/java/kkfileview/config/application.properties:/opt/kkfileview:4.1.0/config/application.properties -p 8860:8012 kkfileview
三、配置
base.url = ${KK_BASE_URL:default}
如果nginx转发了访问地址,需要配置此参数,不然访问ppt会报错,具体详见官方文档说明
四、使用
五、前端url处理
url解码 → base64编码 → url编码
注意:加一步url解码是为了防止拿到的url本来就是url编码过的地址
六、ssl认证
使用kkfileview预览自签https word文件时,出现ssl证书错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
解决方法:
源码添加SslUtils类
package cn.keking.utils;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.*;
public class SslUtils {
/**
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
*/
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
}
同时在下载文件DownloadUtils.download 方法里面增加
//忽略SSL认证
SslUtils.ignoreSsl();
如下
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
String urlStr = fileAttribute.getUrl();
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute);
try {
URL url = WebUtils.normalizedURL(urlStr);
if (isHttpUrl(url)) {
//忽略SSL认证
SslUtils.ignoreSsl();
File realFile = new File(realPath);
FileUtils.copyURLToFile(url, realFile);
} else if (isFtpUrl(url)) {
String ftpUsername = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_USERNAME);
String ftpPassword = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_PASSWORD);
String ftpControlEncoding = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_CONTROL_ENCODING);
FtpUtils.download(fileAttribute.getUrl(), realPath, ftpUsername, ftpPassword, ftpControlEncoding);
} else {
response.setCode(1);
response.setMsg("url不能识别url" + urlStr);
}
response.setContent(realPath);
response.setMsg(fileName);
return response;
} catch (Exception e) {
logger.error("文件下载失败,url:{}", urlStr, e);
response.setCode(1);
response.setContent(null);
if (e instanceof FileNotFoundException) {
response.setMsg("文件不存在!!!");
} else {
response.setMsg(e.getMessage());
}
return response;
}
}