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

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

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

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

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

建立数据表

sql 复制代码
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='系统附件表';

上传路径等配置

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

定义操作类

java 复制代码
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 复制代码
curl 'http://127.0.01:9091/file_server/upload' \
--form 'file=@"/C:/Users/user/Desktop/恐龙头像.png"'


文件下载

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

curl 复制代码
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

相关推荐
Decay__20 分钟前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
vipxieliang32 分钟前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
雪芽蓝域zzs44 分钟前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
余槐i2 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化
恋猫de小郭2 小时前
Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop
android·前端·flutter
杨凯凡2 小时前
Spring Boot 的 @Transactional 为什么会失效?从代理、自调用到异常回滚的排查实战
java·spring boot·spring·事务·后端开发
2501_916008892 小时前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
孤狼GPT2 小时前
ChatGPT、Codex数据库实战:MyBatis-Plus第一页查询正常,翻到第10000页为什么越来越慢?
mysql·chatgpt·mybatis-plus·codex·深分页
Decay__2 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
Franciz小测测3 小时前
MySQL 增量备份实践:文件都在,为什么仍可能恢复失败?
数据库·mysql·binlog