MENU

[泛微 E9] [ 高阶精华 ] 泛微 E9 新插件:kkfileview,让文件预览 “零门槛”

• 2025 年 10 月 20 日 • 阅读: 162 • OA

本博客只涉及部分核心操作,不是保姆级教学,希望你也能有自己的思路,感悟破局的乐趣。

20251020104536.gif

背景

在日常办公中,文件预览是一个高频且重要的需求。传统的文件预览方案往往存在格式支持有限、体验不佳等问题。泛微E9自带的文档预览功能虽然基础,但在面对复杂格式或特殊需求时往往力不从心。

今天给大家介绍如何通过集成开源的kkfileview项目,为泛微E9打造一个强大、统一的文档预览解决方案。

功能亮点

  • 多格式支持:支持Office、PDF、图片、视频、音频等常见格式
  • 无缝集成:与泛微E9原有文档模块完美融合
  • 零客户端:基于Web的纯前端预览,无需安装任何插件
  • 高性能:基于Spring Boot构建,响应迅速
  • 开源免费:基于Apache 2.0协议,可自由使用和修改

实施步骤

第一步:部署kkfileview服务

丸子采用的是从官方GitHub下载源码并自行编译打包的方式。如果你不想自己打包,可以私信丸子获取编译好的版本(有时间的话会分享)。

启动成功后访问演示页
image.png

访问成功界面
image.png

第二步:泛微E9文档功能改造

核心工具类

首先创建一个工具类,用于生成文件下载的ddcode(这是泛微文档外发的核心知识):

package com.onestools;

import weaver.docs.docs.util.DesUtils;

public class getFileDownloadUrl {

    /**
     * 根据文件ID生成临时下载URL
     * @param fileid 文件ID
     * @return 下载URL
     */
    public static String getFileDownloadUrl(int fileid) {
        try {
            String encrypt = new DesUtils().encrypt(1 + "_" + fileid);
            return "/weaver/weaver.file.FileDownload?fileid=" + fileid + "&download=1&ddcode=" + encrypt;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据文件ID和基础URL生成临时下载URL
     * @param fileid 文件ID
     * @param baseurl 基础URL
     * @return 下载URL
     */
    public static String getFileDownloadUrl(int fileid, String baseurl) {
        try {
            String encrypt = new DesUtils().encrypt(1 + "_" + fileid);
            return baseurl + "/weaver/weaver.file.FileDownload?fileid=" + fileid + "&download=1&ddcode=" + encrypt;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

JSP页面改造

ecology目录下/docs/e9/index2file.jsp中增加kkfileview预览逻辑:

增加引用

<%@ page import="com.onestools.getFileDownloadUrl" %>
<%@ page import="sun.misc.BASE64Encoder" %>

image.png

添加kkfileview预览逻辑

// 现在检查kkfileview配置
boolean useKKFileView = "1".equals(rs.getPropValue("kkfileview","IsUsekkFileView"));
String kkFileViewUrl = rs.getPropValue("kkfileview","kkFileViewUrl"); // kkfileview服务地址
String e9BaseUrl = rs.getPropValue("kkfileview","E9BaseUrl"); // E9基础URL
if(useKKFileView && !isEdit) {
    // KKFileView预览逻辑
    if(!"".equals(Util.null2String(kkFileViewUrl)) && !"".equals(Util.null2String(e9BaseUrl))) {
        try {
            // 使用getFileDownloadUrl工具类生成下载链接
            String originUrl = getFileDownloadUrl.getFileDownloadUrl(imagefileId, e9BaseUrl);
            String previewUrl = originUrl + "&fullfilename=" + java.net.URLEncoder.encode(imagefilename, "UTF-8");

            // Base64编码previewUrl
            String base64Url = new BASE64Encoder().encode(previewUrl.getBytes("UTF-8"));
            // 生成最终的iframe地址
            docContent = "<iframe id=\"officeShow\" src=\""+kkFileViewUrl+"/onlinePreview?url="+java.net.URLEncoder.encode(base64Url, "UTF-8")+"\" style=\"display: block;width: 100%;height: 100%; border:0\"></iframe>";
        } catch (Exception e) {
            // 如果kkfileview出错,继续使用原有逻辑
            e.printStackTrace();
        }
    }
}

image.png

第三步:系统配置

ecology目录下/WEB-INF/prop新建kkfileview.properties
增加以下内容:

# 是否开启kkfileview
IsUsekkFileView=1
# kkfileview的外部访问地址
kkFileViewUrl=http://192.168.31.130:8012/kkpreview
# 相对于kkfileview访问E9的地址(建议内网地址)
E9BaseUrl=http://127.0.0.1:8080

注意事项

  1. 安全性考虑:该方案的安全性和稳定性暂未经过全面评估,请在生产环境使用前进行充分测试
  2. 性能优化:大量并发预览时可能需要考虑kkfileview的集群部署
  3. 文件大小:超大文件预览时需要注意网络传输和服务器性能
  4. 移动端适配:本示例只处理了index2file.jsp,如需移动端支持,需要对index2mobile.jsp进行类似改造

总结

通过集成kkfileview,我们成功为泛微E9赋予了强大的文档预览能力。这种"破局"思路不仅适用于文档预览,还可以扩展到其他系统功能的增强和改造。

技术只是工具,思路才是关键。希望这个案例能够激发大家更多的创新想法,在现有系统的基础上创造出更多可能性。


温馨提示:本文涉及的技术方案仅供学习参考,请根据实际环境进行评估和测试。如有技术问题,欢迎交流讨论!

添加新评论

已有 4 条评论
  1. wintsa wintsa

    工具类文件放哪?

    1. @wintsa阅读文章不仔细,捏捏
      com.onestools.getFileDownloadUrl

    2. monologue monologue

      @丸子大佬牛 但是现在kkfileview有个高危漏洞暂未修复还是挺危险的

    3. @monologue是嘟,这种安全性需要把控下