前言

碰到一个项目,要求要office系的文件预览,好家伙,我PHP的三方库找了半天,没找到。
就在我准备放弃的时候,发现了一个神奇的东西,kkfileview,这个东西可以实现各种文件的在线预览,而且还是开源的。
幸亏我之前做过JAVA,不然真的不知道怎么搞了。
把自己的经历记录下来,方便以后复习

kkFileView

介绍

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,xlsx,ppt,pdf,图片,视频,音频

项目下载与编译

github项目地址
gitee项目地址

环境要求

  • JDK 1.8+
  • Maven 3.0+
  • LibreOffice或OpenOffice(Windows下已内置,CentOS或Ubuntu下会自动下载安装,MacOS下需要自行安装)

下载源码

1
git clone [email protected]:kekingcn/kkFileView.git

使用maven编译打包

1
2
cd your-project-dir
mvn clean package -DskipTests -Prelease

使用docker构建镜像

dockerfile文件本质是将你编译好的压缩包文件 ADD 到镜像中,所以你需要先编译好压缩包文件。
所以你可以自定义一些你需要的内容,方便以后使用。

你可以创建一个 rebuild.sh 文件,内容如下:

1
2
#!/bin/bash
docker build -t wlfpanda1012/kkfileview:v4.4 --no-cache .

使用docker运行

你可以创建个 run.sh 文件,内容如下:

1
2
3
4
5
6
#!/bin/sh
docker rm -f kkfileview

docker run --name kkfileview -it \
-p 8012:8012 \
wlfpanda1012/kkfileview:v4.4 /bin/bash

使用

我没有仔细研究,直接使用了使用 在线文件地址 的方式,我只需要预览功能

1
2
3
4
5
6
private function getPreview(string $url): string
{
// 生成预览地址
// 'http://localhost:8012/onlinePreview?url='.urlencode(base64_encode($url));
return config('app.app_file_preview_url').urlencode(base64_encode($url));
}

配合项目使用

其实配合项目使用也比较简单,把编译的文件上传到服务器,然后使用在线文件地址的方式,就可以了。
当然 nginx 配置也是需要的。

在配置nginx之前,先写2份脚本来自动化上传和解压缩(启动)。
当然之后需要使用守护进程来进行管理。不然万一出问题就麻烦了。

上传脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# your ip address
ip=xxx.xxx.xxx.xxx

echo "rsync -rtuvz server/target/kkFileView-*.tar.gz root@$ip:/opt/"

rsync -rtuvz server/target/kkFileView-*.tar.gz root@$ip:/opt/

rsync -rtuvz restart_kkFileView.sh root@$ip:/root/

ssh root@$ip "chmod +x /root/restart_kkFileView.sh && /root/restart_kkFileView.sh"

运行脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

#source /etc/environment
export KKFILEVIEW_BIN_FOLDER=/opt/kkFileView-4.4.0-SNAPSHOT/bin
cd /opt
tar -xzf /opt/kkFileView-4.4.0-SNAPSHOT.tar.gz
echo "kill kkFileView pid"
cd /opt/kkFileView-4.4.0-SNAPSHOT/bin && ./shutdown.sh
echo "start"
cd /opt/kkFileView-4.4.0-SNAPSHOT/bin && ./startup.sh
echo "done"

守护进程

1
2
3
4
5
6
7
8
[program:kkFileView]
process_name=%(program_name)s
command=cd /opt/kkFileView-4.4.0-SNAPSHOT/bin && ./startup.sh
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/kkFileView/supervisor.log

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream kkfileview {
# 轮询负载均衡(如果配置了ip_hash,则会根据ip进行负载均衡)
server 172.16.200.38:8012 weight=1;
server 172.16.200.39:8012 weight=1;
}
server {
listen 443 ssl;
server_name file.xxx.com;
# 省略基础配置
location /fileview/ {
# 使用iphash,保证通过同一个ip访问的请求都会转发到同一个服务器(因为预览服务会生成缓存,如果缓存使用了redis等分布式中间件则iphash可加可不加)
ip_hash;
proxy_pass http://kkfileview/;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-host $host;
proxy_set_header x-forwarded-port $server_port;
proxy_set_header X-forwarded-proto $scheme;
}
}

这样子 就可以利用 file.xxx.com/fileview/onlinePreview?url=xxxxxxxx 的方式进行预览了。