文件的上传、存储和预览是常见的需求。Java Spring Boot 作为一个强大的开发框架,结合 MinIO(高性能对象存储服务)进行文件存储,再搭配 OnlyOffice(强大的在线文档编辑和预览工具)实现文件预览,能为用户提供出色的文件管理体验。下面就为大家详细介绍如何实现这一套完整的功能。
环境准备
-
Java 开发环境:确保你已经安装了 Java 8 及以上版本,并且配置好了环境变量。如果你对 Java 环境搭建不太熟悉,可以参考 Java 官方安装指南 进行操作。
-
Spring Boot:可以使用 Spring Initializr(start.spring.io/ )来快速创建一个 Spring Boot 项目,添加 Spring Web 和 Spring Boot DevTools 依赖。Spring Initializr 是一个非常便捷的工具,它能帮助我们快速生成项目骨架,你可以在官网详细了解其使用方法。
-
MinIO:MinIO 是一个高性能的对象存储服务,兼容亚马逊 S3 云存储服务接口,非常适合存储海量的非结构化数据。可以通过 Docker 快速部署 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 更详细的部署说明,你可以参考 MinIO 官方文档,里面有各种环境下的部署方式和详细配置说明。
-
OnlyOffice:OnlyOffice 是一款功能强大的在线文档编辑和预览工具,支持多种文件格式。同样可以使用 Docker 部署,onlyoffice尽量使用9.03后的版本,可以预加载字体,提高第一次预览速度。命令如下:
docker run -i -t -d -p 80:80 --restart=always onlyoffice/documentserver
若你想深入了解 OnlyOffice 的部署和使用,可查阅 OnlyOffice 官方文档,其中包含了不同操作系统和环境下的部署指南。也可以看我之前的几篇文章:Java 全栈 Devs【工具】:文件编辑预览-OnlyOffice的安装及使用
一、实现文件上传到 MinIO
-
添加 MinIO 依赖 在 pom.xml 中添加 MinIO 依赖:
io.minio minio 8.5.4
添加依赖后,Maven 会自动从中央仓库下载 MinIO 的相关库文件,方便我们在项目中使用 MinIO 的功能。
-
配置 MinIO 客户端 创建一个配置类来初始化 MinIO 客户端:
import io.minio.MinioClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MinioConfig { @Value("{minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }
在这个配置类中,我们使用 @Value 注解从配置文件中读取 MinIO 的端点、访问密钥和秘密密钥,然后通过 MinioClient.builder() 方法构建 MinIO 客户端实例。这样做的好处是可以将配置信息和代码分离,方便后续的维护和修改。
-
实现文件上传接口 创建一个控制器来处理文件上传请求:
import io.minio.MinioClient; import io.minio.PutObjectArgs; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; @RestController public class FileUploadController { @Autowired private MinioClient minioClient; @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { try { String bucketName = "my-bucket"; String objectName = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); long size = file.getSize(); // 创建存储桶(如果不存在) if (!minioClient.bucketExists(bucketName)) { minioClient.makeBucket(bucketName); } // 上传文件 PutObjectArgs putObjectArgs = PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(inputStream, size, -1) .contentType(file.getContentType()) .build(); minioClient.putObject(putObjectArgs); return "文件上传成功!"; } catch (Exception e) { e.printStackTrace(); return "文件上传失败!"; } } }
在这个控制器中,我们使用 @PostMapping 注解定义了一个 /upload 的 POST 请求接口,用于接收前端传来的文件。在处理文件上传时,首先检查存储桶是否存在,如果不存在则创建一个新的存储桶,然后使用 PutObjectArgs 构建上传参数,最后调用 minioClient.putObject() 方法将文件上传到 MinIO 中。
二、实现文件预览(结合 OnlyOffice)
-
获取文件访问链接(推荐) 在 MinIO 中获取文件的访问链接,方便 OnlyOffice 访问:
import io.minio.MinioClient; import io.minio.GetPresignedObjectUrlArgs; import io.minio.http.Method; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController public class FilePreviewController { @Autowired private MinioClient minioClient; @GetMapping("/preview-url") public String getPreviewUrl(@RequestParam("fileName") String fileName) { try { String bucketName = "my-bucket"; GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(fileName) .expiry(1, TimeUnit.HOURS) .build(); return minioClient.getPresignedObjectUrl(args); } catch (Exception e) { e.printStackTrace(); return null; } } }
这里我们使用 @GetMapping 注解定义了一个 /preview-url 的 GET 请求接口,用于获取文件的预签名 URL。预签名 URL 是一种临时的、有有效期的访问链接,通过设置 expiry 参数可以控制链接的有效期,提高文件访问的安全性。
2、使用nginx代理文件路径(推荐)
当然如果你可以使用预访问文件、或者设置桶为共有使用nginx代理、nginx做文件缓存,会更快哦
-
使用预访问文件
-
优点:提前对文件进行处理,生成可预览的格式。在用户请求预览时,直接返回处理好的文件,这样可以大大提高预览速度,尤其对于频繁被预览的文件,能显著提升用户体验。
-
缺点:需要额外的存储空间来存储处理后的文件,增加了存储成本。而且对于实时更新的文件,需要及时更新处理后的文件,否则会出现预览内容与实际文件不一致的情况。
-
安装部署要点:需要搭建专门的文件处理服务,用于将文件转换为可预览格式。该服务要与 Spring Boot 应用和 MinIO 存储进行集成,确保处理后的文件能正确存储到 MinIO 中,并且在用户请求时能准确返回。
-
设置桶为共有并通过 nginx 代理文件预览路径
-
优点:
-
提高预览效率:将 MinIO 中的存储桶设置为共有,外部可以直接访问桶内的文件。配置 nginx 来代理文件预览路径,当用户发起文件预览请求时,nginx 将请求转发到 MinIO 存储桶中的文件地址,避免了文件的多次传输,减少了网络延迟,从而提高了预览速度。
-
可靠性高:nginx 的高性能和稳定性也能保证预览服务的可靠性。
-
缺点:
-
安全风险:将桶设置为共有会使桶内文件直接暴露在网络中,存在一定的安全风险,需要配合其他安全措施,如 IP 访问限制、访问认证等。
-
配置复杂度:nginx 的配置需要一定的专业知识,配置不当可能导致预览服务无法正常工作。
-
安装部署要点:
-
MinIO 桶设置:在 MinIO 客户端中,通过相应的 API 来修改桶的访问策略,使其变为公开可读。
-
nginx 配置:以下是一个简单的 nginx 配置示例:
server { listen 80; server_name your-preview-domain.com; location /preview/ { proxy_pass http://your-minio-server:9000/your-bucket-name/; proxy_set_header Host remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
确保 nginx 服务器能正常访问 MinIO 服务器,并且将请求正确转发。
三、前端集成onlyoffice实现步骤
在前端页面中引入 OnlyOffice 的脚本,并使用获取到的文件访问链接进行文件预览:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件预览</title>
<script type="text/javascript" src="http://your-onlyoffice-server/web-apps/apps/api/documents/api.js"></script>
</head>
<body>
<div id="placeholder"></div>
<script type="text/javascript">
var docEditor = new DocsAPI.DocEditor("placeholder", {
"document": {
"fileType": "docx",
"key": "example-key",
"title": "Example Document",
"url": "http://your-minio-server/my-bucket/example.docx"
},
"editorConfig": {
"mode": "view",
"lang": "en"
}
});
</script>
</body>
</html>
在这个前端页面中,我们引入了 OnlyOffice 的 API 脚本,然后通过 DocsAPI.DocEditor 方法创建一个文档编辑器实例。在 document 对象中,我们指定了文件的类型、唯一键、标题和访问 URL,在 editorConfig 对象中,我们设置了预览模式和语言。这样,当页面加载时,OnlyOffice 就会根据提供的 URL 加载文件并进行预览。
通过以上步骤,我们使用 Java Spring Boot 实现了文件上传到 MinIO 的功能,并且结合 OnlyOffice 实现了文件的在线预览。这种方案不仅可以提高文件存储的可靠性和性能,还能为用户提供便捷的文件预览体验。
一起呱唧呱唧下
-
但是onlyoffice如果使用社区版,高版本的样式pdf,word等预览时样式拆了,要想改就要映射出来改
-
大家在使用 MinIO 和 OnlyOffice 的过程中遇到过哪些问题呢?
-
对于文件上传和预览的安全性,你有什么更好的建议吗?
-
minio也不想开源的样子,最近解决发现之前的文档还有的被删除了?