SpringBoot+MinIO+KKFileView實現(xiàn)文件預(yù)覽功能
在現(xiàn)代的 Web 應(yīng)用中,文件上傳和預(yù)覽是常見的需求場景。尤其是在內(nèi)容管理系統(tǒng)(CMS)或企業(yè)內(nèi)部應(yīng)用中,文件預(yù)覽功能尤為重要。通過 Spring Boot 搭配 MinIO 和 KKFileView,我們可以輕松實現(xiàn)高效的文件存儲和在線預(yù)覽功能。
本文將從以下幾個方面,帶你逐步實現(xiàn)一個簡單的文件預(yù)覽系統(tǒng)。
一、項目背景和技術(shù)選型
- Spring Boot:主流的 Java 后端開發(fā)框架,用于快速構(gòu)建 RESTful 服務(wù)。
- MinIO:一款高性能的對象存儲服務(wù),支持 S3 協(xié)議,適合大文件存儲。
- KKFileView:一款輕量級文件在線預(yù)覽服務(wù),支持多種文件格式(如 Office 文檔、PDF、圖片等)。
系統(tǒng)架構(gòu)圖:
功能目標(biāo)
用戶上傳文件到 MinIO。
后端通過 KKFileView 生成文件預(yù)覽鏈接。
用戶通過前端直接查看文件內(nèi)容。
二、環(huán)境準(zhǔn)備
1. MinIO 安裝和啟動
下載并運(yùn)行 MinIO:
docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -e "MINIO_ROOT_USER=minioadmin" \ -e "MINIO_ROOT_PASSWORD=minioadmin" \ quay.io/minio/minio server /data --console-address ":9001"
訪問 MinIO 控制臺:http://localhost:9001
默認(rèn)賬號密碼:
- 用戶名:minioadmin
- 密碼:minioadmin
創(chuàng)建一個存儲桶(如 preview-files)。
2. KKFileView 安裝和啟動
下載并運(yùn)行 KKFileView:
docker run -d --name kkfileview \ -p 8012:8012 \ --restart=always \ kekingcn/kkfileview:latest
訪問 KKFileView 服務(wù):http://localhost:8012
三、項目代碼實現(xiàn)
1. 引入依賴
在 pom.xml 文件中添加以下依賴:
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MinIO 客戶端 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.4</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>2. 配置文件
在 application.yml 中配置 MinIO 和 KKFileView 服務(wù)地址:
minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin bucketName: preview-files kkfileview: serverUrl: http://localhost:8012
3. MinIO 文件上傳和預(yù)覽服務(wù)
創(chuàng)建 MinioService 類:
import io.minio.*;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.InputStream;
@Service
public class MinioService {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.bucketName}")
private String bucketName;
private MinioClient getClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
public String uploadFile(String fileName, InputStream inputStream, String contentType) throws Exception {
MinioClient client = getClient();
client.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(inputStream, -1, 10485760)
.contentType(contentType)
.build()
);
return endpoint + "/" + bucketName + "/" + fileName;
}
}4. KKFileView 服務(wù)對接
創(chuàng)建 FilePreviewService 類:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class FilePreviewService {
@Value("${kkfileview.serverUrl}")
private String kkFileViewServerUrl;
public String generatePreviewUrl(String fileUrl) {
return kkFileViewServerUrl + "/onlinePreview?url=" + fileUrl;
}
}5. REST 控制器
創(chuàng)建 FileController 類:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
@RestController
@RequestMapping("/files")
public class FileController {
@Autowired
private MinioService minioService;
@Autowired
private FilePreviewService filePreviewService;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
String fileUrl = minioService.uploadFile(file.getOriginalFilename(), inputStream, file.getContentType());
return "上傳成功,文件地址:" + fileUrl;
} catch (Exception e) {
e.printStackTrace();
return "上傳失敗:" + e.getMessage();
}
}
@GetMapping("/preview")
public String previewFile(@RequestParam("fileUrl") String fileUrl) {
return filePreviewService.generatePreviewUrl(fileUrl);
}
}四、運(yùn)行和測試
啟動 Spring Boot 項目。
上傳文件:
curl -F "file=@example.pdf" http://localhost:8080/files/upload
輸出類似以下內(nèi)容:
上傳成功,文件地址:http://localhost:9000/preview-files/example.pdf
生成預(yù)覽鏈接:
curl "http://localhost:8080/files/preview?fileUrl=http://localhost:9000/preview-files/example.pdf"
輸出類似以下內(nèi)容:
http://localhost:8012/onlinePreview?url=http://localhost:9000/preview-files/example.pdf
在瀏覽器中打開預(yù)覽鏈接即可查看文件內(nèi)容。
五、總結(jié)
通過 Spring Boot、MinIO 和 KKFileView 的結(jié)合,我們輕松實現(xiàn)了文件上傳和在線預(yù)覽功能。
- MinIO 提供了高效的對象存儲服務(wù)。
- KKFileView 提供了強(qiáng)大的文檔解析能力。
- Spring Boot 實現(xiàn)了兩者的無縫對接。
這套方案輕量高效,適合企業(yè)內(nèi)部文件管理系統(tǒng),也可以輕松擴(kuò)展至分布式環(huán)境。
到此這篇關(guān)于SpringBoot+MinIO+KKFileView實現(xiàn)文件預(yù)覽功能的文章就介紹到這了,更多相關(guān)SpringBoot MinIO KKFileView文件預(yù)覽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Java中的java.io.IOException: Broken pipe問題
這篇文章主要介紹了解決Java中 java.io.IOException: Broken pipe的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring Boot 安全 API 構(gòu)建之加密解密功能的實踐記錄
本文詳述了如何在SpringBoot3.3環(huán)境中實施API加密的最佳實踐,包括選擇合適的加密算法,密鑰管理,數(shù)據(jù)加密,防止加密漏洞,安全日志記錄,測試和監(jiān)控等方面,同時,文章也對RSA非對稱加密和AES對稱加密的實現(xiàn)步驟進(jìn)行了詳細(xì)的解析2024-10-10
解決idea 從mapper方法直接點(diǎn)進(jìn)xml文件的問題
這篇文章主要介紹了解決idea 從mapper方法直接點(diǎn)進(jìn)xml文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Spring中的Schedule動態(tài)添加修改定時任務(wù)詳解
這篇文章主要介紹了Spring中的Schedule動態(tài)添加修改定時任務(wù)詳解,可能有人會問,為啥不用Quartz,Quartz自然是非常方便強(qiáng)大的,但不是本篇要講的內(nèi)容,本篇就偏要使用SpringSchedule來實現(xiàn)動態(tài)的cron表達(dá)式任務(wù),需要的朋友可以參考下2023-11-11

