Browse Source

Merge pull request #401 from gitchenjh/master

Linux发行版&Docker镜像升级LibreOffice7.3、其他优化
gitchenjh 2 years ago
parent
commit
f5754be9ff

File diff suppressed because it is too large
+ 10 - 13
docker/kkfileview-jdk/Dockerfile


+ 2 - 0
office-plugin/src/main/java/org/artofsolving/jodconverter/office/OfficeUtils.java

@@ -112,6 +112,8 @@ public class OfficeUtils {
                 "/opt/libreoffice7.0",
                 "/opt/libreoffice7.1",
                 "/opt/libreoffice7.2",
+                "/opt/libreoffice7.3",
+                "/opt/libreoffice7.4",
                 "/opt/openoffice4",
                 "/usr/lib/openoffice",
                 "/usr/lib/libreoffice"

+ 5 - 5
server/src/main/bin/install.sh

@@ -2,12 +2,12 @@
 cd /tmp
 
 install_redhat() {
-   wget https://kkfileview.keking.cn/LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz -cO LibreOffice_7_rpm.tar.gz && tar -zxf /tmp/LibreOffice_7_rpm.tar.gz && cd /tmp/LibreOffice_7.1.4.2_Linux_x86-64_rpm/RPMS
+   wget https://kkfileview.keking.cn/LibreOffice_7.3.7_Linux_x86-64_rpm.tar.gz -cO LibreOffice_7_rpm.tar.gz && tar -zxf /tmp/LibreOffice_7_rpm.tar.gz && cd /tmp/LibreOffice_7.3.7.2_Linux_x86-64_rpm/RPMS
    echo $?
    if [ $? -eq 0 ];then
-     yum install -y libXext.x86_64
+     yum install -y libSM.x86_64 libXrender.x86_64  libXext.x86_64
      yum groupinstall -y  "X Window System"
-     yum localinstall *.rpm
+     yum localinstall -y *.rpm
      echo 'install finshed...'
    else
      echo 'download package error...'
@@ -15,7 +15,7 @@ install_redhat() {
 }
 
 install_ubuntu() {
-   wget  https://kkfileview.keking.cn/LibreOffice_7.1.4_Linux_x86-64_deb.tar.gz  -cO LibreOffice_7_deb.tar.gz && tar -zxf /tmp/LibreOffice_7_deb.tar.gz && cd /tmp/LibreOffice_7.1.4.2_Linux_x86-64_deb/DEBS
+   wget  https://kkfileview.keking.cn/LibreOffice_7.3.7_Linux_x86-64_deb.tar.gz  -cO LibreOffice_7_deb.tar.gz && tar -zxf /tmp/LibreOffice_7_deb.tar.gz && cd /tmp/LibreOffice_7.3.7.2_Linux_x86-64_deb/DEBS
    echo $?
  if [ $? -eq 0 ];then
      apt-get install -y libxinerama1 libcairo2 libcups2 libx11-xcb1
@@ -33,4 +33,4 @@ if [ -f "/etc/redhat-release" ]; then
 else
   apt-get install -y wget
   install_ubuntu
-fi
+fi

+ 4 - 4
server/src/main/bin/startup.sh

@@ -9,7 +9,7 @@
 # Description:  v1.1:修改进程启动机制为pid形式。
 #############################
 #
-DIR_HOME=("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1" "/opt/openoffice4" "/usr/lib/openoffice" "/usr/lib/libreoffice")
+DIR_HOME=("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1" "/opt/libreoffice7.2" "/opt/libreoffice7.3" "/opt/libreoffice7.4" "/opt/openoffice4" "/usr/lib/openoffice" "/usr/lib/libreoffice")
 FLAG=
 OFFICE_HOME=
 KKFILEVIEW_BIN_FOLDER=$(cd "$(dirname "$0")" || exit 1 ;pwd)
@@ -32,7 +32,7 @@ else
   grep 'office\.home' ../config/application.properties | grep '!^#'
   if [ $? -eq 0 ]; then
     echo "Using customized office.home"
-  else 
+  else
   for i in ${DIR_HOME[@]}
     do
       if [ -f "$i/program/soffice.bin" ]; then
@@ -42,9 +42,9 @@ else
       fi
     done
     if [ ! -n "${FLAG}" ]; then
-      echo "Installing OpenOffice"
+      echo "Installing LibreOffice"
       sh ./install.sh
-    else 
+    else
       echo "Detected office component has been installed in $OFFICE_HOME"
     fi
   fi

+ 0 - 2
server/src/main/java/cn/keking/ServerMain.java

@@ -1,6 +1,5 @@
 package cn.keking;
 
-import cn.keking.config.AppBanner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -23,7 +22,6 @@ public class ServerMain {
         stopWatch.start();
         ConfigurableApplicationContext context = new SpringApplicationBuilder(ServerMain.class)
                 .logStartupInfo(false)
-                .banner(new AppBanner())
                 .run(args);
         stopWatch.stop();
         Integer port = context.getBean(ServerProperties.class).getPort();

+ 0 - 28
server/src/main/java/cn/keking/config/AppBanner.java

@@ -1,28 +0,0 @@
-package cn.keking.config;
-
-import org.springframework.boot.Banner;
-import org.springframework.core.env.Environment;
-
-import java.io.PrintStream;
-
-/**
- * @author kl (http://kailing.pub)
- * @since 2021/2/8
- */
-public class AppBanner implements Banner {
-    @Override
-    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
-        out.println(
-                "  _      _      ______   _   _         __      __  _                   \n" +
-                " | |    | |    |  ____| (_) | |        \\ \\    / / (_)                  \n" +
-                " | | __ | | __ | |__     _  | |   ___   \\ \\  / /   _    ___  __      __\n" +
-                " | |/ / | |/ / |  __|   | | | |  / _ \\   \\ \\/ /   | |  / _ \\ \\ \\ /\\ / /\n" +
-                " |   <  |   <  | |      | | | | |  __/    \\  /    | | |  __/  \\ V  V / \n" +
-                " |_|\\_\\ |_|\\_\\ |_|      |_| |_|  \\___|     \\/     |_|  \\___|   \\_/\\_/  \n" +
-                "                                                                     \n" +
-                " => Spring Boot ::  (v2.4.2)               QQ1 :: 613025121\n" +
-                " => kkFileView  ::  (v4.1.0-SNAPSHOT)      QQ2 :: 484680571\n" +
-                " => github      ::  https://github.com/kekingcn/kkFileView\n" +
-                " => gitee       ::  https://gitee.com/kekingcn/file-online-preview\n");
-    }
-}

+ 1 - 1
server/src/main/java/cn/keking/service/OfficePluginManager.java

@@ -120,7 +120,7 @@ public class OfficePluginManager {
                     baos.write(b);
                 }
                 String s = baos.toString();
-                if (!"0".equals(s)) {
+                if (!s.startsWith("0")) {
                     String[] cmd = {"sh", "-c", "ps -ef | grep soffice.bin | grep -v grep | awk '{print \"kill -9 \"$2}' | sh"};
                     Runtime.getRuntime().exec(cmd);
                     flag = true;

+ 16 - 7
server/src/main/java/cn/keking/utils/WebUtils.java

@@ -8,6 +8,7 @@ import javax.servlet.ServletRequest;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -157,16 +158,16 @@ public class WebUtils {
         String currentUrl = request.getParameter("currentUrl");
         String urlPath = request.getParameter("urlPath");
         if (StringUtils.isNotBlank(url)) {
-            return decodeBase64String(url);
+            return decodeUrl(url);
         }
         if (StringUtils.isNotBlank(currentUrl)) {
-            return decodeBase64String(currentUrl);
+            return decodeUrl(currentUrl);
         }
         if (StringUtils.isNotBlank(urlPath)) {
-            return decodeBase64String(urlPath);
+            return decodeUrl(urlPath);
         }
         if (StringUtils.isNotBlank(urls)) {
-            urls = decodeBase64String(urls);
+            urls = decodeUrl(urls);
             String[] images = urls.split("\\|");
             return images[0];
         }
@@ -174,12 +175,20 @@ public class WebUtils {
     }
 
     /**
-     * 将 Base64 字符串解码,默认使用 UTF-8
+     * 将 Base64 字符串解码,再解码URL参数, 默认使用 UTF-8
      * @param source 原始 Base64 字符串
      * @return decoded string
+     *
+     * aHR0cHM6Ly9maWxlLmtla2luZy5jbi9kZW1vL%2BS4reaWhy5wcHR4 -> https://file.keking.cn/demo/%E4%B8%AD%E6%96%87.pptx -> https://file.keking.cn/demo/中文.pptx
      */
-    public static String decodeBase64String(String source) {
-        return decodeBase64String(source, StandardCharsets.UTF_8);
+    public static String decodeUrl(String source) {
+        String url = decodeBase64String(source, StandardCharsets.UTF_8);
+        try {
+            url = URLDecoder.decode(url, StandardCharsets.UTF_8.name());
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        return url;
     }
 
     /**

+ 3 - 6
server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java

@@ -56,7 +56,7 @@ public class OnlinePreviewController {
     public String onlinePreview(String url, Model model, HttpServletRequest req) {
         String fileUrl;
         try {
-            fileUrl = WebUtils.decodeBase64String(url);
+            fileUrl = WebUtils.decodeUrl(url);
         } catch (Exception ex) {
             String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
             return otherFilePreview.notSupportedFile(model, errorMsg);
@@ -72,20 +72,18 @@ public class OnlinePreviewController {
     public String picturesPreview(String urls, Model model, HttpServletRequest req) throws UnsupportedEncodingException {
         String fileUrls;
         try {
-            fileUrls = WebUtils.decodeBase64String(urls);
+            fileUrls = WebUtils.decodeUrl(urls);
             // 防止XSS攻击
             fileUrls = HtmlUtils.htmlEscape(fileUrls);
         } catch (Exception ex) {
             String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "urls");
             return otherFilePreview.notSupportedFile(model, errorMsg);
         }
-
         logger.info("预览文件url:{},urls:{}", fileUrls, urls);
         // 抽取文件并返回文件列表
         String[] images = fileUrls.split("\\|");
         List<String> imgUrls = Arrays.asList(images);
         model.addAttribute("imgUrls", imgUrls);
-
         String currentUrl = req.getParameter("currentUrl");
         if (StringUtils.hasText(currentUrl)) {
             String decodedCurrentUrl = new String(Base64.decodeBase64(currentUrl));
@@ -106,7 +104,7 @@ public class OnlinePreviewController {
     @GetMapping("/getCorsFile")
     public void getCorsFile(String urlPath, HttpServletResponse response) {
         try {
-            urlPath = WebUtils.decodeBase64String(urlPath);
+            urlPath = WebUtils.decodeUrl(urlPath);
         } catch (Exception ex) {
             logger.error(String.format(BASE64_DECODE_ERROR_MSG, urlPath),ex);
             return;
@@ -116,7 +114,6 @@ public class OnlinePreviewController {
             logger.info("读取跨域文件异常,可能存在非法访问,urlPath:{}", urlPath);
             return;
         }
-
         logger.info("下载跨域pdf文件url:{}", urlPath);
         try {
             URL url = WebUtils.normalizedURL(urlPath);

+ 14 - 0
server/src/main/resources/banner.txt

@@ -0,0 +1,14 @@
+
+  _      _      ______   _   _         __      __  _
+ | |    | |    |  ____| (_) | |        \ \    / / (_)
+ | | __ | | __ | |__     _  | |   ___   \ \  / /   _    ___  __      __
+ | |/ / | |/ / |  __|   | | | |  / _ \   \ \/ /   | |  / _ \ \ \ /\ / /
+ |   <  |   <  | |      | | | | |  __/    \  /    | | |  __/  \ V  V /
+ |_|\_\ |_|\_\ |_|      |_| |_|  \___|     \/     |_|  \___|   \_/\_/
+
+ => Spring Boot ::  ${spring-boot.version}
+ => kkFileView  ::  4.1.0-SNAPSHOT
+ => Homepage    ::  https://kkfileview.keking.cn
+ => Github      ::  https://github.com/kekingcn/kkFileView
+ => Gitee       ::  https://gitee.com/kekingcn/file-online-preview
+ => QQ Group    ::  613025121  484680571

+ 35 - 8
server/src/main/resources/web/index.ftl

@@ -36,15 +36,15 @@
                 如果你的项目需要接入文件预览项目,达到对docx、excel、ppt、jpg等文件的预览效果,那么通过在你的项目中加入下面的代码就可以
                 成功实现:
                 <pre style="background-color: #2f332a;color: #cccccc">
-                    var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址
-                    window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(base64Encode(url)));
+var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址
+window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(base64Encode(url)));
                 </pre>
             </div>
             <div>
                 新增多图片同时预览功能,接口如下:
                 <pre style="background-color: #2f332a;color: #cccccc">
-                    var fileUrl =url1+"|"+"url2";//多文件使用“|”字符隔开
-                    window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(base64Encode(fileUrl)));
+var fileUrl =url1+'|'+url2;//多url使用'|'字符隔开
+window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(base64Encode(fileUrl)));
                 </pre>
             </div>
         </div>
@@ -254,6 +254,33 @@
         })
     }
 
+    function showLoadingDiv() {
+        var height = window.document.documentElement.clientHeight - 1;
+        $(".loading_container").css("height", height).show();
+    }
+
+    function checkUrl(url){
+        //url= 协议://(ftp的登录信息)[IP|域名](:端口号)(/或?请求参数)
+        var strRegex = '^((https|http|ftp)://)'//(https或http或ftp)
+            + '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@  可有可无
+            + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字
+            + '|' // 允许IP和DOMAIN(域名)
+            + '(localhost)|'	//匹配localhost
+            + '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上.
+            + '\\w+\\.' // 一级域名 -英文或数字  加上.
+            + '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文
+            + '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字
+            + '((/?)|' // url无参数结尾 - 斜杆或这没有
+            + '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符
+        var re = new RegExp(strRegex,'i');//i不区分大小写
+        //将url做uri转码后再匹配,解除请求参数中的中文和空字符影响
+        if (re.test(encodeURI(url))) {
+            return (true);
+        } else {
+            return (false);
+        }
+    }
+
     $(function () {
         $('#table').bootstrapTable({
             url: 'listFiles',
@@ -278,15 +305,15 @@
 
         $('#preview_by_url').submit(function() {
             var _url = $("#_url").val();
+            if (!checkUrl(_url)) {
+                alert('请输入正确的url');
+                return false;
+            }
             var urlField = $(this).find('[name=url]');
             var b64Encoded = Base64.encode(_url);
             urlField.val(b64Encoded);
         });
 
-        function showLoadingDiv() {
-            var height = window.document.documentElement.clientHeight - 1;
-            $(".loading_container").css("height", height).show();
-        }
         $("#btnSubmit").click(function () {
             showLoadingDiv();
             $("#fileUpload").ajaxSubmit({