使用 MinIO 和 KKFileView 实现在线文件预览功能
在项目开发中,文件的在线预览是常见的需求,尤其是对 PDF、Word、Excel 等格式的文件进行无客户端依赖的直接查看。本文将介绍如何通过 MinIO 和 KKFileView 搭建在线文件预览服务,并通过 docker-compose
一键部署。
一、环境准备
1. Docker 安装
在 CentOS 系统上,使用以下命令安装 Docker:
# 更新 yum 包索引
sudo yum update -y# 安装 Docker
sudo yum install -y docker# 启动 Docker 并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker
2. 安装 Docker Compose
Docker Compose 是管理多个容器服务的工具,可以用以下命令安装:
# 下载最新版本的 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose --version
二、服务介绍
1. MinIO
MinIO 是一款高性能的对象存储服务,兼容 AWS S3 API,支持存储海量的文件对象。我们将使用它来管理和存储待预览的文件。
2. KKFileView
KKFileView 是一款轻量级文件在线预览服务,支持多种文件格式(如 PDF、Office 文档、图片等)的预览。通过与 MinIO 集成,可以实现从对象存储中读取文件并进行在线预览。
三、使用 Docker Compose 部署 MinIO 和 KKFileView
以下是 docker-compose.yml
文件的完整内容:
# 描述 Compose 文件的版本信息
version: "2.1"# 定义服务,可以多个
services:minio:image: minio/minio:latestcontainer_name: minioports:- "9090:9000" # MinIO 服务端口- "9001:9001" # MinIO 控制台地址端口environment:MINIO_ROOT_USER: minioadmin # MinIO 管理用户名MINIO_ROOT_PASSWORD: minioadmin # MinIO 管理密码volumes:- /mydata/minio/data:/data # 数据存储挂载路径command: server /data --console-address ":9001" # 启动命令,指定控制台端口restart: always # 保证容器自动重启kkfileview:image: keking/kkfileview:latestcontainer_name: kkfileviewports:- "8012:8012" # KKFileView 服务端口restart: always # 保证容器自动重启
部署步骤
- 将
docker-compose.yml
文件保存至/root/minio/
目录下。 - 执行以下命令启动服务:
cd /root/minio/ docker-compose up -d
我这里放在/home/app/minio目录的minio-docker-compose.yml中然后分别执行
docker-compose -f minio-docker-compose.yml up -d minio
docker-compose -f minio-docker-compose.yml up -d kkfileview
- 验证服务是否启动:
docker ps
输出示例:
[root@lps minio]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc6bfe8f99c6 keking/kkfileview:latest "java -Dfile.encodin…" 7 minutes ago Up 7 minutes 0.0.0.0:8012->8012/tcp, :::8012->8012/tcp kkfileview
02d7a1418809 minio/minio:latest "/usr/bin/docker-ent…" 8 minutes ago Up 8 minutes 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp, 0.0.0.0:9090->9000/tcp, :::9090->9000/tcp minio
四、功能配置
1. 配置 MinIO 存储文件
- 访问 MinIO 控制台:
http://<服务器IP>:9001
- 登录凭据:
- 用户名:
minioadmin
- 密码:
minioadmin
- 用户名:
- 创建一个存储桶(Bucket),用于存储上传的文件。例如,创建
preview
。
然后设置为公开
上传一些测试用例图片或者文件
2. 配置 KKFileView
KKFileView 默认监听 8012
端口,无需复杂配置即可访问:
- 访问地址:
http://<服务器IP>:8012/index
- 上传文件测试:上传文件后,点击“预览”按钮即可在线查看。
3. 集成 MinIO 和 KKFileView
将 MinIO 中的文件链接作为 KKFileView 的输入文件地址进行在线预览:
前端测试demo
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件预览带水印 Demo</title><style>body {font-family: Arial, sans-serif;margin: 20px;}.container {max-width: 400px;margin: 0 auto;}input[type="text"] {width: 100%;padding: 10px;margin-bottom: 10px;border: 1px solid #ccc;border-radius: 5px;box-sizing: border-box;}button {width: 100%;padding: 10px;background-color: #007BFF;color: white;border: none;border-radius: 5px;cursor: pointer;}button:hover {background-color: #0056b3;}/* 模态框样式 */.modal {display: none;position: fixed;z-index: 1000;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);justify-content: center;align-items: center;}.modal-content {position: relative;background: white;padding: 20px;width: 80%;height: 80%;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);border-radius: 8px;overflow: hidden;}.modal-close {position: absolute;top: 10px;right: 10px;font-size: 20px;cursor: pointer;color: #333;}iframe {width: 100%;height: 100%;border: none;}</style>
</head>
<body><h1>文件预览工具</h1><form id="previewForm"><label for="fileUrl">请输入文件的 URL:</label><input type="text" id="fileUrl" placeholder="http://example.com/file.docx"><br><br><label for="watermarkText">请输入水印内容:</label><input type="text" id="watermarkText" placeholder="请输入水印文本"><br><br><button type="button" onclick="previewFile()">预览文件</button></form><!-- 模态框结构 --><div id="previewModal" class="modal"><div class="modal-content"><span class="modal-close" onclick="closeModal()">×</span><iframe id="previewFrame" src=""></iframe></div></div><script>/*** Base64 编码函数* @param {string} str - 需要编码的字符串* @returns {string} Base64 编码后的字符串*/function base64Encode(str) {return btoa(unescape(encodeURIComponent(str)));}/*** 文件预览功能*/function previewFile() {// 获取用户输入的文件 URL 和水印内容const fileUrl = document.getElementById('fileUrl').value.trim();const watermarkText = document.getElementById('watermarkText').value.trim();// 验证输入if (!fileUrl) {alert('请输入文件的 URL!');return;}// 默认水印内容const watermark = watermarkText || '默认水印';try {// 对 URL 进行 Base64 编码const encodedUrl = base64Encode(fileUrl);// 构造预览链接(水印不编码,直接明文传递)const previewUrl = `http://192.168.246.239:8012/onlinePreview?url=${encodedUrl}&watermarkTxt=${encodeURIComponent(watermark)}`;// 在模态框中显示预览内容const iframe = document.getElementById('previewFrame');iframe.src = previewUrl;// 打开模态框openModal();} catch (error) {alert('编码失败,请检查输入内容是否有效!');console.error(error);}}/*** 打开模态框*/function openModal() {const modal = document.getElementById('previewModal');modal.style.display = 'flex';}/*** 关闭模态框*/function closeModal() {const modal = document.getElementById('previewModal');modal.style.display = 'none';// 清空 iframe 内容,避免页面卡顿const iframe = document.getElementById('previewFrame');iframe.src = '';}</script>
</body>
</html>
kkFileView - 在线文件预览
五、总结
通过 MinIO 和 KKFileView,我们实现了高效的文件存储和在线预览功能。MinIO 提供对象存储服务,KKFileView 提供预览能力,两者结合满足了多种办公场景需求。借助 docker-compose
,我们实现了快速部署和服务管理,为开发和运维提供了便利。
相关文章:

使用 MinIO 和 KKFileView 实现在线文件预览功能
在项目开发中,文件的在线预览是常见的需求,尤其是对 PDF、Word、Excel 等格式的文件进行无客户端依赖的直接查看。本文将介绍如何通过 MinIO 和 KKFileView 搭建在线文件预览服务,并通过 docker-compose 一键部署。 一、环境准备 1. Docker …...
Conda-Pack打包:高效管理Python环境
在Python开发中,环境管理是一个不可忽视的重要环节。Conda是一个流行的包管理器和环境管理器,它允许用户创建隔离的环境,以避免不同项目之间的依赖冲突。Conda-pack是一个工具,可以帮助我们将一个conda环境打包成一个可移植文件&a…...
云服务器上搭建 WordPress 全流程指南
WordPress 是全球最受欢迎的开源内容管理系统(CMS),通过 WordPress,你可以轻松搭建博客、企业网站或电子商务平台。而通过云服务器搭建 WordPress,可以使网站获得更好的性能和灵活性。本文将为你提供详细的步骤&#x…...

图像超分辨率技术新进展:混合注意力聚合变换器HAAT
目录 1. 引言: 2. 混合注意力聚合变换器(HAAT): 2.1 Swin-Dense-Residual-Connected Block(SDRCB): 2.2 Hybrid Grid Attention Block(HGAB): 3. 实验结…...

文件IO——01
1. 认识文件 1)文件概念 “文件”是一个广义的概念,可以代表很多东西 操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理 但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬…...

【opencv入门教程】5. Mat 类用法
文章选自: 一、BackGround Mat对象是一种图像数据结构,它是一个容器,存储任何通道任何数的图片数据以及对应的矩阵,使用完成后,内存自动释放。二、Code void Samples::MatFunc() {1. 图像处理// 方法1:…...

SSM虾米音乐项目2--分页查询
1.分页查询的底层逻辑 首先根据用户输入的流派,进行模糊查询根据查询的数据进行分页需要前端用户提供pageNo(当前页数)和pageSize(每页的数据量)并且要从后端计算count(总数据量)和totalPage(总页数),以及startNum(每页开始的记录)从而将对应的页面数据…...
nodejs 获取本地局域网 ip 扫描本地端口
因为傻逼老板的垃圾需求,不得不成长 示例代码: 获取本地局域网 ip 地址: 需要注意的是:如果存在虚拟机网络,则返回的是虚拟机网络的 ipv4 地址 import os from os; export const getLocalIp () > {const in…...
区块链签名种类
1. eth_sign 简介:最早实现的签名方法,用于对任意数据进行签名。签名内容:直接对原始消息的哈希值进行签名。特点: 安全性较低,因为签名的消息没有明确的上下文或结构。很容易被滥用,攻击者可以伪造签名内…...
【062B】基于51单片机无线病房呼叫系统(+时间)【Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统NRF24L01无线模块DS1302时钟芯片LCD1602液晶显示按键设置蜂鸣器LED灯。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,采用LCD1602液晶显示呼叫信息,系统共有两个板子(一个接…...

突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!
文章链接:https://arxiv.org/pdf/2411.18623 项目链接:https://lift3d-web.github.io/ 亮点直击 提出了Lift3D,通过系统地提升隐式和显式的3D机器人表示,提升2D基础模型,构建一个3D操作策略。 对于隐式3D机器人表示&a…...

【pyspark学习从入门到精通24】机器学习库_7
目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分:在现实世界中,我们并不总是有目标特征的奢侈条件,因此我们需要回归到无监督学习的范式,在那里我们尝试在数据中发现模式。 在出生数据…...
Echart折线图属性设置 vue2
Echart折线图 官方配置项手册 Documentation - Apache ECharts 下面代码包含:设置标题、线条样式、图例圆圈的样式、显示名称格式、图片保存、增加Y轴目标值 updateChart(data) {const sortedData data.slice().sort((a, b) > new Date(a.deviceTime) - ne…...

LabVIEW-简单串口助手
LabVIEW-简单串口助手 串口函数VISA配置串口VISA写入函数VISA读取函数VISA资源名称按名称解除捆绑 函数存放位置思维导图主体界面为以下 串口函数 VISA配置串口 VISA写入函数 VISA读取函数 VISA资源名称 按名称解除捆绑 函数存放位置 思维导图 主体界面为以下 从创建好的“枚举…...

Linux下,用ufw实现端口关闭、流量控制(二)
本文是 网安小白的端口关闭实践 的续篇。 海量报文,一手掌握,你值得拥有,让我们开始吧~ ufw 与 iptables的关系 理论介绍: ufw(Uncomplicated Firewall)是一个基于iptables的前端工具…...

C#开发-集合使用和技巧(九)Join的用法
在C#中,IEnumerable 的 Join 方法用于根据键将两个序列中的元素进行关联。Join 方法通常用于执行类似于 SQL 中的内连接操作。以下是 Join 方法的基本用法: 基本语法 public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult…...

Dockerfile容器镜像构建技术
文章目录 1、容器回顾1_容器与容器镜像之间的关系2_容器镜像分类3_容器镜像获取的方法 2、其他容器镜像获取方法演示1_在DockerHub直接下载2_把操作系统的文件系统打包为容器镜像3_把正在运行的容器打包为容器镜像 3、Dockerfile介绍4、Dockerfile指令1_FROM2_RUN3_CMD4_EXPOSE…...

Github 2024-12-01 开源项目月报 Top20
根据Github Trendings的统计,本月(2024-12-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目9Go项目2HTML项目1Shell项目1Jupyter Notebook项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Py…...
Spring Boot 3项目集成Swagger3教程
Spring Boot 3项目集成Swagger3教程 ?? 前言 欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。?? ?? 技能清单 编程语言:Java、C、C、Python、Go、前端技术:Jquery、Vue.js、React、uni-app、EchartsUI设计: Element-u…...

NISP信息安全一级考试200道;免费题库;大风车题库
下载链接:大风车题库-文件 大风车题库网站:大风车题库 大风车excel(试题转excel):大风车excel...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...