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

相关推荐
for_ever_love__10 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
IT研究室12 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
凤山老林13 小时前
Spring Boot 集成 Sa-Token 实现高可用权限认证:登录鉴权、动态路由权限与接口防重放实战
spring boot·后端·sa-token·bootstrap
jack1868914 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
Sayai14 小时前
DataX 离线数据同步实战:Elasticsearch 数据批量导出 MySQL(作业配置、并发调优与定时同步平台化设计)
大数据·mysql·elasticsearch·datax·数据同步
颜酱15 小时前
一栋商业大厦,讲清 InnoDB 的表空间、段、区和页
后端·mysql
Wx-bishekaifayuan15 小时前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
PC2005-cloud16 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
应用市场17 小时前
不用一张图片的像素小游戏:小人是字符串,房间是矩形,平衡靠两千个假玩家
android·kotlin·游戏开发
墨神谕17 小时前
RabbitMQ 从入门到实战:核心原理、消息模型、可靠性机制与 Spring Boot 实战
spring boot·rabbitmq·java-rabbitmq