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

Spring Boot + MinIO + KKFile:三步搭建企业级文件预览系统

在这里插入图片描述

1. 前言

在文档管理系统里,让用户点开就能看,而不是“先下载、再找软件打开”。下面把 MinIO(对象存储)KKFileView(万能预览) 在 Spring Boot 里一次性打通。

2. 先把Minio跑起来

本地一条命令启动:

minio server /data --console-address ":9001"

浏览器打开 http://localhost:9001,默认账号密码都是 minioadmin

3. Spring Boot 配置

3.1 加依赖

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version> <!-- 用最新版更稳 -->
</dependency>

3.2 配置文件

# application.properties
minio.endpoint=http://localhost:9000
minio.access-key=minioadmin
minio.secret-key=minioadmin
minio.bucket-name=files

3.3 写Service

@Service
public class MinioService {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;private MinioClient client;@PostConstructpublic void init() {client = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}/*** 上传文件并返回 objectName*/public String upload(MultipartFile file) throws Exception {String objectName = System.currentTimeMillis() + "-" + file.getOriginalFilename();client.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());return objectName;}/*** 拿到带签名的临时下载地址*/public String getDownloadUrl(String objectName) throws Exception {return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(1, TimeUnit.HOURS) // 1小时有效期.build());}
}

注解:

  1. @PostConstruct 让 Bean 一加载就初始化 MinioClient,省得每次现建。
  2. objectName 使用时间戳 + 原文件名,避免重名冲突。
  3. getPresignedObjectUrl 返回的 URL 带签名,安全又临时,不用担心直链泄露。

4.KKFileView 一键部署

docker run -d -p 8012:8012 --name kkfileview keking/kkfileview:4.4.0

访问 http://localhost:8012,看到欢迎页就 OK。

5. 把预览地址拼出来

5.1 再加一行配置

kkfileview.server=http://localhost:8012

5.2 Service 里补方法

@Value("${kkfileview.server}")
private String kkServer;/*** 生成 KKFileView 预览地址*/
public String buildPreviewUrl(String objectName) throws Exception {String downloadUrl = getDownloadUrl(objectName);return kkServer + "/onlinePreview?url="+ URLEncoder.encode(downloadUrl, StandardCharsets.UTF_8);
}

注解:

  1. URLEncoder.encode 保证 URL 作为 Query 参数时不会炸。
  2. downloadUrl 已经带签名,KK 拿到就能直接拉文件。
  3. 返回的地址直接丢给前端,iframe 或新窗口打开即可,零代码量嵌入。

6.暴露接口

@RestController
@RequestMapping("/files")
@RequiredArgsConstructor
public class FileController {private final MinioService minioService;/*** 上传接口*/@PostMapping("/upload")public ApiResp<String> upload(@RequestParam MultipartFile file) {try {String objectName = minioService.upload(file);return ApiResp.success(objectName);} catch (Exception e) {return ApiResp.fail(e.getMessage());}}/*** 预览接口*/@GetMapping("/preview")public ApiResp<String> preview(@RequestParam String objectName) {try {String previewUrl = minioService.buildPreviewUrl(objectName);return ApiResp.success(previewUrl);} catch (Exception e) {return ApiResp.fail(e.getMessage());}}
}

注解:

  1. 统一返回 ApiResp,前端省事。
  2. try-catch 把异常转成友好提示,不给用户看 500 页面。
  3. 两个接口都是 RESTful,前端 Vue / React / 小程序都能直接调。

测试

  1. Postman 调 /files/upload,拿到 objectName。
  2. 浏览器直接开 /files/preview?objectName=xxx,Word、Excel、PDF 秒开。
http://www.lryc.cn/news/606498.html

相关文章:

  • SpringBoot3.x入门到精通系列:1.2 开发环境搭建
  • 前端核心技术Node.js(二)——path模块、HTTP与模块化
  • 2025年物联网新趋势:格行随身WiFi的模块化架构与低延迟优化
  • 代码随想录算法训练营第三十七天
  • 从C语言到C++:拥抱面向对象编程的全新世界
  • LCGL使用简介
  • 【qiankun】基于vite的qiankun微前端框架下,子应用的静态资源无法加载的问题
  • 详解Vite 配置中的代理功能
  • 基于岗位需求的康养休闲旅游服务实训室建设方案
  • 【赵渝强老师】OceanBase租户的资源管理
  • Opus音频编码器全解析:从技术原理到实战应用
  • 在 CentOS 7 安装中文字体
  • yolo目标检测基础知识
  • 【算法基础课-算法模板2】数据结构
  • 【Node】nvm在windows系统无管理员权限切换node版本
  • Vue3+Vite项目如何简单使用tsx
  • 【基于落霞归雁思维框架的软件项目管理实践指南】
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-53,(知识点:硬件电路问题排查,CPU上电后未运转,供电、时钟,复位,硬件连接)
  • 【Linux系列】SSD 与 HDD
  • Git之本地仓库管理
  • 尾插法和倒序输出
  • 【Keras学习笔记】开发环境搭建
  • pig Cloud中分布式锁的使用(setIfAbsent)
  • QT聊天项目DAY17
  • LeetCode 85:最大矩形
  • Shader开发(五)什么是渲染管线
  • Flutter兼容的iOS的最低版本号
  • 链特异性文库是什么?为什么它在转录组测序中越来越重要?
  • 【普中STM32精灵开发攻略】--第 2 章 开发板功能及使用介绍
  • 浅谈“压敏电阻”