SpringBoot 实现任意文件在线预览功能

一 文件在线预览

在现代工作与生活环境中,文件共享与查看已经成为日常不可或缺的一部分。不过传统的文件处理方式要求用户下载文件到本地后才能查看,这不仅占用了设备的存储空间,还可能导致文件传播效率低下,甚至存在安全隐患。

因此,现在很多应用都支持文件在线预览,像我们常见的 docx、pptx、xlsx、md、图片、pdf 等等都可以在浏览器中直接查看文件内容,无需下载,大大提高了文件处理的便捷性和安全性。

二 kkFileView

kkFileView 是一个基于 Spring Boot 框架构建的开源文件文档在线预览解决方案。它不仅支持广泛的文件类型,而且使用非常简单。

kkFileView 主要有如下一些特点:

  • 广泛支持的文件类型:kkFileView 支持包括但不限于 doc、docx、xls、xlsx、ppt、pptx、pdf、txt 等主流办公文档,以及 jpg、jpeg、png、gif 等图像文件,mp3、wav、mp4、flv 等音视频格式,zip、rar、jar 等压缩包文件,还有多种类文本及代码文件,如 html、xml、json、yaml、java、py、cpp 等。

  • 易部署性:kkFileView 提供了 ZIP、TAR.GZ 发行包和 Docker 镜像,支持一键启动脚本和丰富的配置项,无论是物理机、虚拟机还是 Docker 容器环境,都能轻松部署。

  • 跨平台服务:kkFileView 支持 Windows、Linux 和 MacOS 等多种操作系统,实现了跨平台的无缝使用。

  • 高性能:基于高效的文件读取与流传输策略,kkFileView 在处理大文件时也能保持流畅,提升用户体验。

  • 安全性:通过设置访问权限和时效性 token,kkFileView 可以有效保护文件安全,防止未授权访问和恶意操作。

  • API 接口:提供 RESTful API,支持 Java、PHP、Python、Go 等多种开发语言,方便与其他系统集成。

  • 开源免费:kkFileView 遵循 Apache 2.0 许可证,用户可以根据需要自由修改和分发。

  • 扩展性强:支持多种文件类型,且易于添加新的文件类型支持或自定义显示模板。

三 使用 kkFileView

kkFileView 是独立部署运行的,所以使用起来非常方便。

3.1 安装部署

kkFileView 需要先安装才能使用。这也是官方推荐的使用方式。

安装有两种方式。

下载源码启动

  1. 从 https://gitee.com/kekingcn/file-online-preview/releases 下载最新版发行包

  2. 解压kkFileView-x.x.x文件(Windows.zip包,Linux/MacOS.tar.gz包)

  3. 打开解压后文件夹的 bin 目录,运行 startup 脚本(Windows 下以管理员身份运行startup.bat,Linux 以 root 用户运行 startup.sh)

  4. 浏览器访问本机 8012 端口 http://127.0.0.1:8012 即可看到项目演示用首页

Docker 启动

启动脚本:

docker run -it -p 8012:8012 keking/kkfileview:4.1.0

如果网络不畅,可以通过如下方式启动:

wget https://kkfileview.keking.cn/kkFileView-4.1.0-docker.tar docker load -i kkFileView-4.1.0-docker.tar docker run -it -p 8012:8012 keking/kkfileview:4.1.0

启动之后,页面如下:

3.2 文件预览

当我们的项目内需要预览文件时,只需要调用浏览器打开 kkFileView 的预览接口,并传入须要预览文件的 url,类似下面这样:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script> </head> <body> <script> var url1 = 'http://192.168.43.178:8080/1.csv'; var url2 = 'http://192.168.43.178:8080/2.png'; var url3 = 'http://192.168.43.178:8080/3.doc'; var url4 = 'http://192.168.43.178:8080/4.pdf'; var url5 = 'http://192.168.43.178:8080/5.pptx'; var url6 = 'http://192.168.43.178:8080/6.md'; </script> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url1)));">csv</button> <br> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url2)));">png</button> <br> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url3)));">doc</button> <br> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url4)));">pdf</button> <br> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url5)));">pptx</button> <br> <button onclick="window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url6)));">md</button> <br> </body> </html>

url1~url6 是我这里几个不同格式文件的访问地址,调用 kkFileView 的预览接口 http://127.0.0.1:8012/onlinePreview,并将我们的文件 url 作为参数传递进去,就可以预览文件内容了。

是不是很简单!

这是官方给的使用方式。如果想把这个项目合并到自己现有项目中,也是可以的,只是稍微麻烦一些,需要分析接口并且手动合并代码了,不过对于有经验的小伙伴来说,应该也不是啥难事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人生分水岭】正复利与负复利重要的都有哪些?你不是缺努力,是缺“复利路径设计

绝大多数人的人生不是被一次决策毁掉的&#xff0c;而是被“长期负复利”慢慢拖垮的。 人生中最大的生存消费就是房子和车&#xff0c;都会越来越便宜&#xff0c;慎买二手。越晚买花得越少。除非必要和真的有钱。 无论是向正或向负&#xff0c;加上时间复利都会成为正或负的参…

扔掉了本地 IDE,开发部署只要 3 分钟。

“在我电脑上明明是好的”&#xff0c;这句话我曾说过无数遍&#xff0c;也听过无数遍。新项目启动要配几天环境&#xff0c;线上出了问题&#xff0c;却发现和本地环境完全对不上。我开始思考一个问题&#xff1a;为什么我们必须依赖一个如此脆弱、不一致的本地开发环境&#…

《P3228 [HNOI2013] 数列》

题目描述小 T 最近在学着买股票&#xff0c;他得到内部消息&#xff1a;F 公司的股票将会疯涨。股票每天的价格已知是正整数&#xff0c;并且由于客观上的原因&#xff0c;最多只能为 N。在疯涨的 K 天中小 T 观察到&#xff1a;除第一天外每天的股价都比前一天高&#xff0c;且…

66.qemu设备树配置

//导出qemu设备树到内核根目录 qemu-system-aarch64 -machine virt -machine dumpdtborigin.dtb //反编译成dts ./scripts/dtc/dtc -I dtb -O dts -o origin.dts origin.dtb//在origin.dts根节点下添加自定义节点 /{quan{#address-cells <1>;#size-cells <1>;com…

一算钱领导就让用BigDecimal ,为什么它可以不丢失精度?

我们都知道在计算钱的时候首选 BigDecimal&#xff0c;因为它不会导致丢失精度的情况&#xff0c;尤其在金融领域&#xff0c;为了保证数据的精度&#xff0c;往往都会使用BigDecimal。本文就来探讨下为什么BigDecimal可以保证精度不丢失。类介绍首先来看一下BigDecimal的类声明…

用这套新工作流,把上线时间从半天压到3分钟

“在我电脑上明明是好的”&#xff0c;这句话我曾说过无数次&#xff0c;也听过无数次。每次上线前&#xff0c;我们团队都要花大量时间在联调和解决各种诡异的环境问题上。我开始反思&#xff1a;我们真正的问题&#xff0c;或许根本不是代码&#xff0c;而是那个看不见、摸不…

【毕业设计】机器学习 基于python深度学习的猫狗表情识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

GB/T 24137-2009 木塑装饰板检测

木塑装饰板是指室内外装饰用非结构型木塑复合板材。主要有墙板、壁板和天花等&#xff1b;以木塑复合板为基材经涂饰或以各种装饰材料饰面而成的板材称作饰面木塑装饰板。GB/T 24137-2009木塑装饰板检测介绍测试要求测试标准外观GB/T 24137长度,宽度,厚度尺寸GB/T 19367.1边缘直…

【毕业设计】机器学习基于cnn识别微小细胞细菌细胞器

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【疾病识别】SVM农作物叶子虫害识别与分类【含GUI Matlab源码 14872期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

两个链表的第一个公共结点

求解代码 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {// 初始化两个临时指针&#xff0c;分别指向两个链表的头节点ListNode temp1 pHead1;ListNode temp2 pHead2;// 只要两个指针不指向同一个节点&#xff0c;就继续遍历while (temp1 ! temp2…

用这4招,优雅的实现Spring Boot 异步线程间数据传递

Spring Boot 自定义线程池可以实现异步开发&#xff0c;在实际开发中需要在父子线程之间传递一些数据&#xff0c;比如用户信息&#xff0c;链路信息等等比如用户登录信息使用ThreadLocal存放保证线程隔离&#xff0c;代码如下&#xff1a;/*** description 用户上下文信息*/ p…

深度学习毕设项目:基于CNN深度学习python的遥感图片识别沙漠湖泊和森林

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【课程设计/毕业设计】基于python机器学习的猫狗表情识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【建议收藏】AI 音乐提示词终极指南|全网最全的创作控制手册|Suno 进阶指南|第 15 篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno用邓紫棋的声音唱《我不是真正的快乐》 | 进阶指南 | 第8篇 Suno 12 轨全轨分离导出midi伴奏分离实战&#xff5c;进阶指南&#xff5c;第 11 篇 续写卡在 2 秒&#xff1f;解决方案…

链表相加(二)

代码求解 public ListNode reverseList(ListNode pHead){if(pHead null){return null;}ListNode pre null;ListNode cur pHead;ListNode next pHead;while(cur!null){next cur.next;cur.next pre;pre cur;cur next;}return pre;}public ListNode addInList (ListNode h…

从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序

本文大纲今天来看一道前端面试的代码输出题。 面试官提供了一段 Javascript 代码&#xff0c;要求给出这段代码运行后的输出结果。 const obj {a: 0, };obj[1] 0; obj[obj.a] obj.a; const values Object.values(obj); obj[values[1]] obj.a; console.log(obj);先分析这道…

在RabbitMQ中,怎么确保消息不会丢失?

为了确保消息不会丢失&#xff0c;可以从以下3个方面解决&#xff1a; 1.在创建队列的时候设置durable为true&#xff0c;发布消息的时候设置delivery为2&#xff0c;从而确保队列和消息都是持久的。 这样&#xff0c;就算是RabbitMQ服务器重启也不会造成消息的丢失。 2.开启发…