当前位置: 首页 > news >正文

Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务

Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务

背景:比较常见的需求,做成公共的服务,后期维护比较简单,可扩展多个存储介质,上传逻辑简单,上传后提供一个文件id,后期可直接通过此id获取到文件,提供下载和预览(三方框架kkFileView),一站式解决,堪称完美。

设计思路:文件上传成功后提供文件ID,文件表记录文件信息,存储路径等,后续操作需提交文件ID。

  • 文件上传
  • 文件下载
  • 文件预览(提供下载 url 至 kkFileView 即可)

建立数据表

DROP TABLE IF EXISTS sys_file_info;
CREATE TABLE `sys_file_info` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`file_id` varchar(255) DEFAULT NULL COMMENT '文件id',`original_name` varchar(255) DEFAULT NULL COMMENT '文件原名',`upload_name` varchar(255) DEFAULT NULL COMMENT '文件名',`upload_path` varchar(255) DEFAULT NULL COMMENT '上传路径',`download_url` varchar(255) DEFAULT NULL COMMENT '下载url',`preview_url` varchar(255) DEFAULT NULL COMMENT '预览url',`upload_time` datetime DEFAULT NULL COMMENT '上传时间',`content_type` varchar(255) DEFAULT NULL COMMENT '文件类型',`suffix` varchar(255) DEFAULT NULL COMMENT '文件后缀',`size` bigint DEFAULT NULL COMMENT '文件大小',`download_count` int DEFAULT '0' COMMENT '下载次数',`create_by` varchar(255) DEFAULT NULL COMMENT '创建者',`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',`update_by` varchar(255) DEFAULT NULL COMMENT '更新者',`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',`deleted` tinyint DEFAULT '0' COMMENT '删除:0未删除,1已删除',PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='系统附件表';

上传路径等配置

app:# 附件存储路径upload-attachments: /data/attachments/# api 文件下载 urlfile-download-url: ${app.host.web}/file_server/download/{}?fullfilename={}# kkFileView 文件预览 urlfile-preview-url: ${app.host.web}/preview/onlinePreview?url={}

定义操作类

public interface ISysFileInfoService extends IService<SysFileInfo> {/*** 保存文件,默认删除原文件*/FileInfoQueryVO saveFile(String srcPath);/*** 上传文件*/FileInfoQueryVO uploadFile(MultipartFile file);/*** 删除文件*/boolean deleteFile(String fileId);/*** 查询文件*/FileInfoQueryVO queryFile(String fileId);/*** 下载次数 + 1*/void incrementCount(String fileId);}

文件上传

curl 'http://127.0.01:9091/file_server/upload' \
--form 'file=@"/C:/Users/user/Desktop/恐龙头像.png"'

在这里插入图片描述
在这里插入图片描述

文件下载

直接访问 downloadUrl 即可,fullfilename 参数可忽略,是为了兼容 kkFileView (提供文件类型判断)

http://127.0.0.1:9091/file_server/download/1864906203106402304?fullfilename=1864906203106402304.png

文件预览

前提:部署 kkFileView ,参考:https://blog.csdn.net/z1353095373/article/details/144290951
直接访问 previewUrl 即可

源码

https://gitee.com/zhaomingjian/workspace_jason_demo/tree/master/file-server-boot

相关文章:

Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务

Spring Boot 3.0 MySQL 8.0 kkFileView 实现完整文件服务 背景&#xff1a;比较常见的需求&#xff0c;做成公共的服务&#xff0c;后期维护比较简单&#xff0c;可扩展多个存储介质&#xff0c;上传逻辑简单&#xff0c;上传后提供一个文件id&#xff0c;后期可直接通过此i…...

【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题

本文内容来自YashanDB官网&#xff0c;原文内容请见&#xff1a;https://www.yashandb.com/newsinfo/7488290.html?templateId1718516 问题现象 如下图&#xff0c;php使用odbc数据源&#xff0c;查询表数据&#xff0c;mysql可以显示出来&#xff0c;yashan显示数据被截断。…...

为什么ETH 3.0需要Lumoz的ZK算力网络?

1.Lumoz 模块化计算层 Lumoz 协议是一个全球分布式模块化计算协议&#xff0c;致力于提供先进的零知识证明&#xff08;ZKP&#xff09;服务&#xff0c;支持ZK技术的发展&#xff0c;为ZK、AI等前沿技术提供强大的算力支撑。面对当前零知识计算领域计算成本的挑战&#xff0c…...

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…...

(重点来啦!)MySql基础增删查改操作(详细)

目录 一、客户端和数据库操作&#xff1a; 二、表操作 1.查看当前数据库中有哪些表 2.创建一张新表 3.查看表结构&#xff1a; 4.删除表 三、CRUD增删查改 1.新增——插入 2.查询操作 a.全列查询&#xff1a; b.指定列查询&#xff1a; c.列名为表达式的查询&#…...

WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…...

阿里云轻量应用服务器开放端口,图文教程分享

阿里云轻量应用服务器如何开放端口&#xff1f;在轻量服务器管理控制台的防火墙中添加规则即可开通端口&#xff0c;开通80端口就填80&#xff0c;开通443就填443端口&#xff0c;开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…...

分布式 CAP理论 总结

前言 相关系列 《分布式 & 目录》《分布式 & CAP理论 & 总结》《分布式 & CAP理论 & 问题》 分布式 分布式的核心是将大型业务拆解成多个子业务以使之在不同的机器上执行。分布式是用于解决单个物理机容量&性能瓶颈问题而采用的优化手段&#xf…...

【UNION 和 UNION ALL 】关键字在MySql中的用法,以及注意事项

在 MySQL 中&#xff0c;UNION 和 UNION ALL 都用于将多个 SELECT 语句的结果合并到一个结果集中。它们的主要区别在于 UNION 去除重复 的行UNION ALL 保留所有 的行 示例 …...

GauHuman阅读笔记【3D Human Modelling】

笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...

SkyWalking 和 ELK 链路追踪实战

一、背景 最近在给项目搭建日志平台的时候&#xff0c;采用的方案是 SkyWalking ELK 日志平台&#xff0c;但发现 ELK 日志平台中的日志没有 Trace ID&#xff0c;导致无法追踪代码报错的整体链路。 空哥提示&#xff1a;Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…...

深度学习中的损失函数

损失函数是深度学习模型训练过程中不可或缺的一部分&#xff0c;是模型预测值与真实值之间差异的客观衡量标准。它们是模型训练的基础&#xff0c;指导算法调整模型参数&#xff0c;以最小化损失并提高预测准确性。它们衡量了模型预测值与真实值的吻合程度。通过最小化这种损失…...

android编译assets集成某文件太大更新导致git仓库变大

不知道大家有没有类似的困扰&#xff0c;你的工程assets文件过大&#xff0c;我曾经在某度车机地图团队工作过一段时间时候&#xff0c;每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后&#xff0c;你会发现你如果重新git clone这个仓库会非常大…...

技术支持人员发现跨域问题,该如何处理

跨域问题通常是由于浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;引起的。简而言之&#xff0c;浏览器阻止了一个域上的网页访问另一个域的资源&#xff0c;目的是为了安全性。跨域问题通常发生在以下场景&#xff1a; 在一个网站的前端应用程序&#xff08;如…...

有 SpringBoot 助力,广场舞团解锁花式舞步密码

3 系统分析 3.1 系统可行性分析 3.1.1 经济可行性 由于本系统是作为毕业设计系统&#xff0c;且系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xff0c;只想要通过该系统的开发提高自身学术水平&#xff0c;不需要特定服务器等额外花费。所有创造及工作…...

【推荐算法】单目标精排模型——FiBiNET

key word: 学术论文 Motivation&#xff1a; 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的&#xff0c;这篇文章的作者提出了采用SENET实现动态学习特征的重要性&#xff1b;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…...

从零开始学TiDB(3)TiKV 持久化机制

如图&#xff0c;每个TiKV有两个rocksdb实例&#xff0c;rocksdbKV复制存储键值对&#xff0c;rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似&#xff0c;在OB中每个Unit及其副本构成了paxos组&#xff0c;在TiDB中叫raft…...

集合ArrayList

黑马程序员Java的个人笔记 BV17F411T7Ao p111~p115 目录 集合存储数据类型的特点 创建对象 ArrayList 成员方法 .add 增加元素 .remove 删除元素 .set 修改元素 .get 查询元素 .size 获取长度 基本数据类型对应的包装类 Character 练习 返回多个数据 集合存储…...

后端API接口设计标准(Java)

Controller 层&#xff08;API接口&#xff09; 无论是传统的三层架构还是现在的COLA架构&#xff0c;Controller 层依旧有一席之地&#xff0c;说明他的必要性&#xff1b;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现&#xff0c;但是它负责接收…...

Oracle Recovery Tools工具一键解决ORA-00376 ORA-01110故障(文件offline)---惜分飞

客户在win上面迁移数据文件,由于原库非归档,结果导致有两个文件scn不一致,无法打开库,结果他们选择offline文件,然后打开数据库 Wed Dec 04 14:06:04 2024 alter database open Errors in file d:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_6056.trc: ORA-01113:…...

Python制做一个简易PDF编辑器——关于PDF文字编辑实现的思路

在Python零基础快速入门最后一篇&#xff0c;我们一起做了一个PDF编辑小工具&#xff0c;里面只实现的PDF翻页浏览等&#xff0c;并没有实现PDF的文字在线编辑&#xff0c;是因为在PDF编辑器中实现文字编辑功能是一个相对复杂的过程&#xff0c;因为PDF格式本质上是一个用于呈现…...

RabbitMQ如何保证消息不被重复消费

前言&#xff1a; 正常情况下&#xff0c;消费者在消费消息后&#xff0c;会给消息队列发送一个确认&#xff0c;消息队列接收后就知道消息已经被成功消费了&#xff0c;然后就从队列中删除该消息&#xff0c;也就不会将该消息再发送给其他消费者了。不同消息队列发出的确认消…...

Windows Terminal ssh到linux

1. windows store安装 Windows Terminal 2. 打开json文件配置 {"$help": "https://aka.ms/terminal-documentation","$schema": "https://aka.ms/terminal-profiles-schema","actions": [{"command": {"ac…...

vue实现页面自动滚动,鼠标悬浮暂停,移开继续

1、给div一个id <div class"kb_nei_new_left" id"chartsContainer">2、定义一个自动滚动的方法 autoSroll(Id) {// flag 为true时停止滚动var flag false;// 定时器var timer;function roll() {var h -1;timer setInterval(function () {flag …...

第3章:文本样式 --[CSS零基础入门]

CSS(层叠样式表)允许你以多种方式定制文本的外观。以下是一些常用的文本和字体相关的CSS属性: 1.字体 字体系列 当然,下面是两个使用不同字体系列的CSS示例。每个示例都展示了如何指定一个字体系列,并提供备用字体以确保在用户的系统中找不到首选字体时仍有合适的字体可…...

从视觉到雷达:多模态感知如何引领自动驾驶安全革命

文章目录 摘要引言多模态感知融合的原理与架构感知技术的特点多模态感知融合的目标 数据融合实现示例代码结构与主要组件模型定义 MultimodalFusionModel前向传播&#xff08;forward 方法&#xff09;模型细节剖析实践应用 QA环节总结参考资料 摘要 本文探讨了多模态感知技术…...

若依集成更好用的easyexcel

背景 若依使用的是apach poi并在此基础上进行封装apach poi的原生的api是很复杂的&#xff0c;若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的&#xff0c;依赖于文件大小的限制在此前提下&#xff0c;如果没法满足客户的需求&#xff08;超大型文件的上传&am…...

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

线段树模板

单点修改 #include <bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(false),cin.tie(nullptr); #define rep(i, x, y) for(int i(x), _(y);i<_;i) #define rrep(i, x, y) for(int i(x), _(y);i>_;i--) #define all(x) x.begin(),x.end() #d…...

算法刷题Day15: BM37 二叉搜索树的最近公共祖先

题目链接 描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q&#xff0c;最近公共祖先LCA(T,p,q)表示一个节点x&#xff0c;满足x是p和q的祖先且x的深度尽可能大。在这里&#xff0c;一个节点也可以…...

正则表达式去除文本中括号()<>[]里的内容

一行文本中包含有各种括号&#xff0c;如()、<>、[]&#xff0c;我们希望把括号及括号内的内容0去除&#xff0c;可以通过正则表达式来实现。 匹配() pattern r\([^)]*\) # 匹配()匹配一个左括号(&#xff0c;然后匹配0个或多个不是右括号的任意字符[^)]*&#xff0c…...

Environment Modules安装配置

Environment Modules安装配置 Environment Modules是一款用来管理计算机软件环境的软件&#xff0c;通过简单的命令来控制计算机环境变量。本文接受该软件的安装和配置方法 系统&#xff1a; Linux OpenSUSE 15.6 软件版本&#xff1a; modules 5.5 依赖&#xff1a; gcc 7.5…...

constexpr、const和 #define 的比较

constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义&#xff1a;constexpr用于定义在编译期可求值的常量表达式。示例&#xff1a;constexpr int x 5;这里&#xff0c;x的值在编译期就确定为5。 const 定义&#xff1a;const表示变量在运行期间不能被修改&…...

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…...

如何制作“优美”PPT

目录 1.免费PPT模板网站&#xff1a; 2.免费有较好质量的图片网站&#xff1a; 免费图片资源 免费透明PNG图片资源&#xff1a; 免费icon图片资源&#xff1a; 3.选择好的图片&#xff1a; 图片底色 4.要与不要 千万不要&#xff1a; 一定要&#xff1a; 6.一些建议…...

5G模组AT命令脚本-控制模组进入飞行模式

控制模组进入飞行模式 控制模组进入飞行模式 控制模组进入飞行模式 控制模组进入飞行模式 #!/bin/bash ## 5G模组采用USB3.0与上位机连接&#xff0c;usb接口在上位机上虚拟出多个port,其中一个可用于发送AT命令&#xff0c;控制模组 ## 本脚本控制模组进入飞行模式## flyin …...

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…...

Vue 2 生命周期函数详解

Vue 2 生命周期函数详解 引言 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;用于构建用户界面。理解 Vue 的生命周期函数&#xff08;Lifecycle Hooks&#xff09;对于开发高效的 Vue 应用至关重要。本文将详细介绍 Vue 2 的生命周期钩子、每个阶段的作用及其代码示例&…...

Vue的路由实现模式:hash模式和history模式

Vue 路由的两种模式&#xff1a; hash 模式&#xff1a; 类似于住在一个大房子里&#xff0c;你的地址很长&#xff0c;但用一个 “门牌号”&#xff08;# 后面的部分&#xff09;来标识你住哪间房间。 例如&#xff1a; bash http://example.com/#/home 这就好比 “example.…...

R语言 | 峰峦图 / 山脊图

目的&#xff1a;为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …...

Kubernetes(K8s)

头条&#xff1a;参考资料 Kubernetes 入门指南&#xff1a;从基础到实践_kubernetes 从入门到实践-CSDN博客 Kubernetes&#xff08;k8s&#xff09;与docker的区别 Docker、Kubernetes之间的区别_docker和kubernetes区别-CSDN博客 Docker部署SpringBoot项目&#xff08;镜…...

【代码随想录|贪心算法05】

56.合并区间 题目链接56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 这道题思路跟前两道也很像&#xff0c;就是更新把相同的区间合并而已。 class Solution { public: static bool cmp(const vector<int>& a,const vector<int>& b){return a[0…...

QQ聊天室--C++基础项目--QT+Socket网络编程

目录 一、项目概述 二、项目成果 1、QQ基础界面展示&#xff1a; 2、群聊界面展示&#xff1a; 3、聊天功能展示 三、项目代码 1、登录头文件&#xff08;denglu.h&#xff09; 2、登录源文件&#xff08;denglu.cpp&#xff09; 3、聊天界面头文件&#xff08;widget.…...

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…...

今日商协丨商协会在“双循环”新发展格局中的作用

在当今全球经济环境中&#xff0c;世界格局正在经历深刻变化&#xff0c;中国正在全面构建“双循环”新发展格局&#xff0c;以实现更高质量、更可持续的发展。在这一过程中&#xff0c;商协会发挥着不可或缺的作用。 商协会在国内大循环中扮演促进者的角色&#xff0c;不仅活…...

前端项目安装node-sass

这个依赖比较难装&#xff0c;因为这个依赖需要安装的版本是和node版本绑定的&#xff0c;所以你需要去sass的官网找到对应关系&#xff0c;下面是我的版本信息&#xff1a; node 16.14.2 node-sass:^6.0.1 sass-loader:^10.2.0 "sass": "^1.82.0", 你…...

算法-字符串-678.有效的括号字符串

一、题目 二、思路解析 1.思路&#xff1a; 用leftMin变量来记录存在的“&#xff08;”&#xff0c; 用leftMax变量记录字符串中最多的“&#xff08;” 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.遍历字符串&#xff1a; a.当前字符为"("&#xff0c;le…...

linux 压缩文件为zip

在 Linux 系统中&#xff0c;可以使用 zip 命令来压缩文件或目录 打开终端&#xff08;Terminal&#xff09;。 使用 cd 命令导航到要压缩的文件或目录所在的路径。 运行以下命令来压缩文件或目录&#xff1a; 压缩单个文件&#xff1a; zip output.zip file.txt这里&#xf…...

Cisco Packet Tracer | Cisco Packet Tracer - VLAN 实验 - 交换机的 VLAN 划分

关注这个工具的其它相关笔记&#xff1a;Cisco Packet Tracer —— 使用教程合集-CSDN博客 0x01&#xff1a;VLAN 划分 - 单个交换机 0x0101&#xff1a;拓扑搭建流程 从软件底部拖出一台交换机&#xff08;笔者选择的型号是 2960 IOS15&#xff09;&#xff1a; 然后再拖出四…...

《计算机网络》(408大题)

2009 路由转发和静态路由的计算 子网划分、路由聚合的计算 注&#xff1a;CIDR中的子网号可以全为0或1&#xff0c;但是其主机号不允许。 注&#xff1a; 这里其实是把到互联网的路由当做了一个默认路由&#xff08;当一个目的网络地址与路由表中其他都不匹配时&#xff0c;…...