1.kkFileView介绍

目录

1.kkFileView介绍

2.源码下载

3.项目启动及配置文件

4.项目打包及部署

4.1 打包

4.2 部署

4.3 查看日志

5.项目接入kkFileView

6.搭建过程中常见的问题解决

6.1 提示找不到OFFICE组件

6.2 Xshell关闭转发连接

6.3 提示进程已处于运行状态,进程号为XXXX,kill不掉的情况

6.4 乱码


kkFileView是使用spring boot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4、mp3以及众多类文本如txt、html、xml、java、properties、sql、js、md、json、conf、ini、vue、php、py、bat、gitignore等文件在线预览。

中文文档:README.md · keking/kkFileView - Gitee.com

官方演示:kkFileView演示首页

2.源码下载

github站点:凯京科技 · GitHub 

giee站点:keking: 凯京科技 

高雄修改版:https://gitee.com/gaoxingzaq/file-online-preview-masterkkFileView 高雄修改版: kkFileView 高雄修改版,官方版:https://gitee.com/kekingcn/file-online-preview, 官方群:433403637, OFFICE在线浏览 , 使用spring boot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4、mp3、ofd、eml以及众

3.项目启动及配置文件

  • 下载源码后,导入IDEA,安装相关pom依赖,即可启动。
  • 项目启动演示地址为:http://127.0.0.1:8012 
  • application.properties配置文件(可配置pdf分页、redis、自动清除缓存以及水印等):具体见官方文档介绍
  • 可根据项目的需求进行二次开发

4.项目打包及部署

4.1 打包

#直接使用maven打包
cd file-online-preview
mvn clean package -DskipTests

或者使用maven工具打包(打包父模块)

打包完成后,生成4个文件

 由于项目需要,需要部署到linux,这个将tar.gz上传至服务器并解压

4.2 部署

        解压上传的压缩包

        解压成功后,进入到bin文件内,运行startup.sh脚本(OpenOffice或LiberOffice Windows下已内置,CentOS或Ubuntu下会自动下载安装,MacOS下需要自行安装)

        如上图,则表示运行成功。如果要停止服务,运行shutdown.sh脚本即可。

        反向代理:

        示例配置文件如下

location /
{
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    
    	add_header Cache-Control no-cache;
}

4.3 查看日志

cd log
ls
# kkFileView.log  kkFileView.log.314824277.formatted  README.txt  README.txt.29272841.formatted
tail -f -n 100 kkFileView.log

5.项目接入kkFileView

这里以文件流的形式(即接入第三方文件系统)

前端转码:
 

var originUrl = 'http://127.0.0.0:8080/filedownload?fileId=1'; //要预览文件的访问地址

var previewUrl = originUrl + '&fullfilename=/test.txt';//(由于使用的是高雄修改版,必须在fullfilename后面加反斜杠)

window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(previewUrl)));


后端转码(业务需要,在后端进行base64转码):

String url = "文件下载地址" +"&fullfilename=/"+文件名;
Base64.Encoder encoder = Base64.getEncoder();
byte[] textByte = url.getBytes("UTF-8");
String encodedText = encoder.encodeToString(textByte);
String encodedURL = URIEncoderUtil.encodeURIComponent(encodedText);
URL = "http://127.0.0.0:8012/onlinePreview?url="+ encodedURL;

附上JAVA中类似JS encodeURIComponent()函数的工具类

import java.io.UnsupportedEncodingException;

public class URIEncoderUtil {
    public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";

    /**
     * Description:
     *
     * @param str
     * @return
     * @throws UnsupportedEncodingException
     * @see
     */
    public static String encodeURI(String str)
            throws UnsupportedEncodingException
    {
        String isoStr = new String(str.getBytes("UTF8"), "ISO-8859-1");
        char[] chars = isoStr.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < chars.length; i++ )
        {
            if ((chars[i] <= 'z' && chars[i] >= 'a') || (chars[i] <= 'Z' && chars[i] >= 'A')
                    || chars[i] == '-' || chars[i] == '_' || chars[i] == '.' || chars[i] == '!'
                    || chars[i] == '~' || chars[i] == '*' || chars[i] == '\'' || chars[i] == '('
                    || chars[i] == ')' || chars[i] == ';' || chars[i] == '/' || chars[i] == '?'
                    || chars[i] == ':' || chars[i] == '@' || chars[i] == '&' || chars[i] == '='
                    || chars[i] == '+' || chars[i] == '$' || chars[i] == ',' || chars[i] == '#'
                    || (chars[i] <= '9' && chars[i] >= '0'))
            {
                sb.append(chars[i]);
            }
            else
            {
                sb.append("%");
                sb.append(Integer.toHexString(chars[i]));
            }
        }
        return sb.toString();
    }

    /**
     * Description:
     *
     * @param input
     * @return
     * @see
     */
    public static String encodeURIComponent(String input)
    {
        if (null == input || "".equals(input.trim()))
        {
            return input;
        }

        int l = input.length();
        StringBuilder o = new StringBuilder(l * 3);
        try
        {
            for (int i = 0; i < l; i++ )
            {
                String e = input.substring(i, i + 1);
                if (ALLOWED_CHARS.indexOf(e) == -1)
                {
                    byte[] b = e.getBytes("utf-8");
                    o.append(getHex(b));
                    continue;
                }
                o.append(e);
            }
            return o.toString();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        return input;
    }

    private static String getHex(byte buf[])
    {
        StringBuilder o = new StringBuilder(buf.length * 3);
        for (int i = 0; i < buf.length; i++ )
        {
            int n = (int)buf[i] & 0xff;
            o.append("%");
            if (n < 0x10)
            {
                o.append("0");
            }
            o.append(Long.toString(n, 16).toUpperCase());
        }
        return o.toString();
    }
}


解码工具类

package com.poly.rbl.plugin.uri;
 
public class URIDecoderUtil
{
    
    
    /**
     * 
     * Description: 
     * 
     * @param encodedURI
     * @return 
     * @see
     */
    public static String decodeURIComponent(String encodedURI)
    {
        char actualChar;
 
        StringBuffer buffer = new StringBuffer();
 
        int bytePattern, sumb = 0;
 
        for (int i = 0, more = -1; i < encodedURI.length(); i++ )
        {
            actualChar = encodedURI.charAt(i);
 
            switch (actualChar)
            {
                case '%':
                {
                    actualChar = encodedURI.charAt(++i);
                    int hb = (Character.isDigit(actualChar) ? actualChar - '0' : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
                    actualChar = encodedURI.charAt(++i);
                    int lb = (Character.isDigit(actualChar) ? actualChar - '0' : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
                    bytePattern = (hb << 4) | lb;
                    break;
                }
                case '+':
                {
                    bytePattern = ' ';
                    break;
                }
                default:
                {
                    bytePattern = actualChar;
                }
            }
 
            if ((bytePattern & 0xc0) == 0x80)
            { // 10xxxxxx
                sumb = (sumb << 6) | (bytePattern & 0x3f);
                if (--more == 0) buffer.append((char)sumb);
            }
            else if ((bytePattern & 0x80) == 0x00)
            { // 0xxxxxxx
                buffer.append((char)bytePattern);
            }
            else if ((bytePattern & 0xe0) == 0xc0)
            { // 110xxxxx
                sumb = bytePattern & 0x1f;
                more = 1;
            }
            else if ((bytePattern & 0xf0) == 0xe0)
            { // 1110xxxx
                sumb = bytePattern & 0x0f;
                more = 2;
            }
            else if ((bytePattern & 0xf8) == 0xf0)
            { // 11110xxx
                sumb = bytePattern & 0x07;
                more = 3;
            }
            else if ((bytePattern & 0xfc) == 0xf8)
            { // 111110xx
                sumb = bytePattern & 0x03;
                more = 4;
            }
            else
            { // 1111110x
                sumb = bytePattern & 0x01;
                more = 5;
            }
        }
        return buffer.toString();
    }
}

至此,kkFileView服务已搭建完成,以下是在搭建过程中出现的部分问题

6.搭建过程中常见的问题解决

6.1 提示找不到OFFICE组件

运行过程中,可能会出现找不到OFFICE组件错误,如下图

 

 解决:如果运行脚本文件出现这个错误,把安装的openoffice或LibreOffice卸载,再重新运行一遍脚本。

yum remove libreoffice*

重新安装成功后,记得重启服务器以及服务,如若不能解决,见官方文档。

以下是官方解决方案:

1.1、首先安装 开源OFFICE  openoffice或LibreOffice 建议安装LibreOffice
1.2、是打开配置文件 路径是 kkFileView-4.0.0\config\application.properties 
(1)、指定OFFCIE安装路径 /opt/libreoffice7.1
(2)、如果是手动安装的自行修改自己的路径参考(1)
1.3、运行OFFICE脚本命令 (LibreOffice) 
(1)、(/opt/libreoffice7.2/代表脚本路径自行修改)
/opt/libreoffice7.2/program/soffice --headless --accept="socket,host=127.0.0.1,port=2001;urp;" --nofirststartwizard & 
(2)、(openoffice4脚本命令)
/opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
1.4、看运行脚本提示
(1)、出现ID并没提示错误,表示安装正确
(2)、出现ID并提示错误,请百度搜索错误信息修复错误,再次运行命令知道不在提示错误

6.2 Xshell关闭转发连接

6.3 提示进程已处于运行状态,进程号为XXXX,kill不掉的情况

删除掉bin目录下,kkFileView.pid文件重新执行脚本

6.4 乱码

附上官方解决方案

  1. 打开bin目录里面的startup.bat加入-Dfile.encoding=UTF-8

  2. 大部分Linux系统上并没有预装中文字体或字体不全,需要把常用字体拷贝到Linux服务器上,具体操作如下: 下载如下字体包 http://kkfileview.keking.cn/fonts.zip 文件解压完整拷贝到Linux下的 /usr/share/fonts目录。然后依次执行mkfontscale 、mkfontdir 、fc-cache使字体生效

其他问题,详情见kkFileView官网文档

PS:编辑不易,给个赞~~~

Logo

前往低代码交流专区

更多推荐