kkFileView 服务配置

1、服务部署

名称: waf-fileview (可自定义)

Docker镜像:172.16.102.2:5000/library/keking/kkfileview:4.2.1.0425

容器端口:8012 (这里生产环境建议以集群IP访问,开发环境可以设置为NodePort方式用于测试)

环境变量:

KK_FILE_UPLOAD_ENABLED:true(生产环境禁用首页上传)

KK_CONTEXT_PATH:/waf-fileview (上下文路径)

KK_BASE_URL:default (提供预览服务的地址,默认从请求url读,如果使用nginx等反向代理,需要手动设置:/waf-fileview 或 http://xxx:xx/waf-fileview)

KK_OFFICE_PREVIEW_SWITCH_DISABLED:true(禁用预览切换,图片与PDF切换)

KK_OFFICE_PREVIEW_TYPE:pdf (预览类型,默认为图片方式)

KK_CACHE_TYPE:redis (缓存类型,默认为jdk,用户水印、登录验证需要开启redis

KK_SPRING_REDISSON_ADDRESS:172.16.103.10:23168 (redis主机端口,可用服务名+端口)

KK_SPRING_REDISSON_DATABASE:1(保持与主应用缓存一致)

KK_SPRING_REDISSON_PASSWORD:**** (redis密码)

USER_AUTH_DISABLE:false(是否禁用用户授权,默认为禁用)

USER_AUTH_SECRET:**** (用户授权加密cookie key)

USER_WATERMARK_DISABLE:false (是否禁用用户水印,默认为禁用)

WATERMARK_ALPHA:0.1 水印透明度

WATERMARK_TXT:XXXX (默认水印,没启用用户水印才显示默认水印,不需要水印可不设置该属性)

1682400885489

在开启缓存不清理后KK_CACHE_CLEAN_ENABLED:false,可以对文件进行持久化存储,挂载容器路径:/opt/kkFileView-4.2.1/file

1689667625658

附:项目配置文件

#######################################不可动态配置,需要重启生效#######################################
server.port = ${KK_SERVER_PORT:8012}
server.servlet.context-path= ${KK_CONTEXT_PATH:/}
server.servlet.encoding.charset = utf-8
#文件上传限制前端
spring.servlet.multipart.max-file-size=500MB
#文件上传限制
spring.servlet.multipart.max-request-size=500MB
## Freemarker 配置
spring.freemarker.template-loader-path = classpath:/web/
spring.freemarker.cache = false
spring.freemarker.charset = UTF-8
spring.freemarker.check-template-location = true
spring.freemarker.content-type = text/html
spring.freemarker.expose-request-attributes = true
spring.freemarker.expose-session-attributes = true
spring.freemarker.request-context-attribute = request
spring.freemarker.suffix = .ftl

# office-plugin
## office转换服务的进程数,默认开启两个进程
office.plugin.server.ports = 2001,2002
## office 转换服务 task 超时时间,默认五分钟
office.plugin.task.timeout = 5m

#预览生成资源路径(默认为打包根路径下的file目录下)
#file.dir = D:\\kkFileview\\
file.dir = ${KK_FILE_DIR:default}

#允许预览的本地文件夹 默认不允许任何本地文件被预览
#file.dir = D:\\kkFileview\\
local.preview.dir = ${KK_LOCAL_PREVIEW_DIR:default}


#openoffice home路径
#office.home = C:\\Program Files (x86)\\OpenOffice 4
office.home = ${KK_OFFICE_HOME:default}

#缓存实现类型,不配默认为内嵌RocksDB(type = default)实现,可配置为redis(type = redis)实现(需要配置spring.redisson.address等参数)和 JDK 内置对象实现(type = jdk),
cache.type =  ${KK_CACHE_TYPE:jdk}
#redis连接,只有当cache.type = redis时才有用
spring.redisson.address = ${KK_SPRING_REDISSON_ADDRESS:127.0.0.1:6379}
spring.redisson.password = ${KK_SPRING_REDISSON_PASSWORD:}
spring.redisson.database = ${KK_SPRING_REDISSON_DATABASE:0}

#缓存是否自动清理 true 为开启,注释掉或其他值都为关闭
cache.clean.enabled = ${KK_CACHE_CLEAN_ENABLED:true}
#缓存自动清理时间,cache.clean.enabled = true时才有用,cron表达式,基于Quartz cron
cache.clean.cron = ${KK_CACHE_CLEAN_CRON:0 0 3 * * ?}

#######################################可在运行时动态配置#######################################
#提供预览服务的地址,默认从请求url读,如果使用nginx等反向代理,需要手动设置
#base.url = https://file.keking.cn
base.url = ${KK_BASE_URL:default}

#信任站点,多个用','隔开,设置了之后,会限制只能预览来自信任站点列表的文件,默认不限制
#trust.host = kkview.cn
trust.host = ${KK_TRUST_HOST:default}

#是否启用缓存
cache.enabled = ${KK_CACHE_ENABLED:true}

#文本类型,默认如下,可自定义添加
simText = ${KK_SIMTEXT:txt,html,htm,asp,jsp,xml,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd}
#多媒体类型,默认如下,可自定义添加
media = ${KK_MEDIA:mp3,wav,mp4,flv}
#是否开启多媒体类型转视频格式转换,目前可转换视频格式有:avi,mov,wmv,3gp,rm
#请谨慎开启此功能,建议异步调用添加到处理队列,并且增加任务队列处理线程,防止视频转换占用完线程资源,转换比较耗费时间,并且控制了只能串行处理转换任务
media.convert.disable = ${KK_MEDIA_CONVERT_DISABLE:false}
#支持转换的视频类型
convertMedias = ${KK_CONVERTMEDIAS:avi,mov,wmv,mkv,3gp,rm}
#office类型文档(word ppt)样式,默认为图片(image),可配置为pdf(预览时也有按钮切换)
office.preview.type = ${KK_OFFICE_PREVIEW_TYPE:image}
#是否关闭office预览切换开关,默认为false,可配置为true关闭
office.preview.switch.disabled = ${KK_OFFICE_PREVIEW_SWITCH_DISABLED:false}

#是否禁止演示模式
pdf.presentationMode.disable = ${KK_PDF_PRESENTATION_MODE_DISABLE:true}
#是否禁止打开文件
pdf.openFile.disable = ${KK_PDF_OPEN_FILE_DISABLE:true}
#是否禁止打印转换生成的pdf文件
pdf.print.disable = ${KK_PDF_PRINT_DISABLE:true}
#是否禁止下载转换生成的pdf文件
pdf.download.disable = ${KK_PDF_DOWNLOAD_DISABLE:true}
#是否禁止bookmark
pdf.bookmark.disable = ${KK_PDF_BOOKMARK_DISABLE:true}
#是否禁用首页文件上传
file.upload.disable = ${KK_FILE_UPLOAD_ENABLED:false}

#预览源为FTP时 FTP用户名,可在ftp url后面加参数ftp.username=ftpuser指定,不指定默认用配置的
ftp.username = ${KK_FTP_USERNAME:ftpuser}
#预览源为FTP时 FTP密码,可在ftp url后面加参数ftp.password=123456指定,不指定默认用配置的
ftp.password = ${KK_FTP_PASSWORD:123456}
#预览源为FTP时, FTP连接默认ControlEncoding(根据FTP服务器操作系统选择,Linux一般为UTF-8,Windows一般为GBK),可在ftp url后面加参数ftp.control.encoding=UTF-8指定,不指定默认用配置的
ftp.control.encoding = ${KK_FTP_CONTROL_ENCODING:UTF-8}

#水印内容
#例:watermark.txt = ${WATERMARK_TXT:凯京科技内部文件,严禁外泄}
#如需取消水印,内容设置为空即可,例:watermark.txt = ${WATERMARK_TXT:}
watermark.txt = ${WATERMARK_TXT:}
#水印x轴间隔
watermark.x.space = ${WATERMARK_X_SPACE:10}
#水印y轴间隔
watermark.y.space = ${WATERMARK_Y_SPACE:10}
#水印字体
watermark.font = ${WATERMARK_FONT:微软雅黑}
#水印字体大小
watermark.fontsize = ${WATERMARK_FONTSIZE:18px}
#水印字体颜色
watermark.color = ${WATERMARK_COLOR:black}
#水印透明度,要求设置在大于等于0.005,小于1
watermark.alpha = ${WATERMARK_ALPHA:0.2}
#水印宽度
watermark.width = ${WATERMARK_WIDTH:180}
#水印高度
watermark.height = ${WATERMARK_HEIGHT:80}
#水印倾斜度数,要求设置在大于等于0,小于90
watermark.angle = ${WATERMARK_ANGLE:10}

#Tif类型图片浏览模式:tif(利用前端js插件浏览);jpg(转换为jpg后前端显示);pdf(转换为pdf后显示,便于打印)
tif.preview.type = ${KK_TIF_PREVIEW_TYPE:tif}

# 备案信息
BeiAn = 
#禁止上传类型
prohibit =${KK_PROHIBIT:exe,dll,bat}
#删除密码
sc.password =${KK_SC_PASSWORD:12345678}

# 是否禁用用户授权(默认禁用,启用后需要带入有效的token才能进行操作)
user.auth.disable = ${USER_AUTH_DISABLE:true}
# 用户授权启用后,可设置一个cookie的加解密匙
user.auth.secret = ${USER_AUTH_SECRET:}
#是否禁用用户水印(默认禁用,启用后URL必须带用户的水印,并对参数加密)
user.watermark.disable = ${USER_WATERMARK_DISABLE:true}
# 日志级别
logging.level.com.wiseda=${WISEDA_LOG_LEVEL:debug}

2、服务调用

2.1、添加base64

# 安装base64
npm install --save js-base64 

2.2、.env 添加配置

# .env文件配置

# 文件预览地址
VUE_APP_FILE_VIEW_API = '/wpm-fileview/onlinePreview?url='
# 文件下载地址(文件预览后端服务下载,可以通过服务名调用)
VUE_APP_FILE_DOWNLOAD_API = 'http://wpm-server-service:8810/wpmapi/v2/waf/file'

2.3、文件预览

# 预览JS参考
handlePreview(row) {
	# 获取文件名后缀
    const suffix = row.name.substring(row.name.indexOf('.'))
    # 文件预览前缀(可配置到环境变量)
    const fileviewUrl = process.env.VUE_APP_FILE_VIEW_API
    # 文件下载前缀
    const prefix = process.env.VUE_APP_FILE_DOWNLOAD_API
    # 文件下载地址
    const fileUrl = `${prefix}/${row.uploadId}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${row.uploadId+suffix}`
    # base64编码URL
    var base64Url = Base64.btoa(fileUrl)
    # cookie加密密匙(16位字符,可通过系统参数配置,不要在代码里写死,以免不安全)
    var secret='***************'
    # 设置cookie(在启用用户认证需要设置)
    Cookies.set('Waf-Fileview-Cookie', encryption(Vue.ls.get(ACCESS_TOKEN),secret))
    # 打开文件预览地址(也可通过vue窗口自行封装通过iframe展现)
    window.open(fileviewUrl+base64Url)
}

2.4、通过api接口入队

在文件上传后,点击预览时,需要先进行转换,当文件比较大时,转换会比较慢。这时在文件上传后,可以将文件添加到队列里进行转换,这样在操作完业务,文件可能就转换完成了。

请求信息:

URL: /waf-fileview/addTask

Method: GET

传入参数: url (URL可以通过服务+端口拼接URL地址)

# 调用示例
/waf-fileview/addTask?url=http://dmm-server-service.dmm:8810/dmm-server/v2/waf/file/1648517899785412608?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODE5NzQ5MDcsImNsaW1OYW1lIjoiaWdGclRzY2VrQkFuNVZSMjhDcG0vdz09In0.dffl_RoOJSxhM6bp68bDNjdrkoCvLV0IVDf22a6lK1c&fullfilename=1648517899785412608.docx

3、常见问题

3.1、您没有权限访问,请联系管理员!

检查日志,如果是解密失败表示kkFileView中配置的USER_AUTH_SECRET环境变量与前端加密的Key不一致

如出现Waf-Fileview-Cookie-不存在 表示kkFileView在启用用户授权验证 USER_AUTH_DISABLE =false后,前端没有设置授权cookie

用户授权验证失败:[CzgddwhyBSkJKXMeJKCUPTp+d/+yOWIzbNDNq53i9NBWYGGgYUoIeP8xdZLOejcE0XfvNNSrCXEA3By4OIjQSR4WDUPJy09gvqyAVgMUaetEZNn5VVOHZ+rgEXAAAv5aLKSVy4IommCzC0BN+Ikx4iZIIsBWCbUz4JCKpVL0gODWNr6mZLvHgsXLhJOIhchI2z5FUL9Ccrxc2mvbuy26Bw==]-[s0meH1ymA28_2Dmb]解密失败:Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
2023-06-29 03:56:48.181 ERROR 1 --- [tp1285524499-16] c.keking.web.filter.SecurityFilterProxy : 用户授权验证失败:Waf-Fileview-Cookie-不存在

3.2、Missing PDF-文件不存在

这里主要原因是转换的文件找不到了,可能由于pod重启后,转换文件没在挂载存储卷,导致缓存还在,文件不存在出现的错,需要删除缓存key再重新转换

转换文件路径: /opt/kkFileView-4.2.1/file

PDF.js v2.10.377 (build: 156762c48) 信息:Missing PDF "http://d.wiseda.cn/wpm-fileview/oTcgTv4pEaGs2yWLmmMPRQ.pdf".

1688019567530

找到converted-preview-pdf-file缓存key,将当前找不到的删除,再重新打开进行重新转换

1688019530877

上次更新:
编辑者: 李贤伟, 李全