基于 MongoDB 及 Spring Boot 的文件服务器的实现
2017-06-15 09:57
519 查看
云栖社区 2017-06-14 18:56
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
本文将介绍通过 MongoDB 存储二进制文件,从而实现一个文件服务器 MongoDB File Server。
文件服务器的需求
本文件服务器致力于小型文件的存储,比如博客中图片、普通文档等。由于MongoDB 支持多种数据格式的存储,对于二进制的存储自然也是不话下,所以可以很方便的用于存储文件。由于
MongoDB 的 BSON 文档对于数据量大小的限制(每个文档不超过16M),所以本文件服务器主要针对的是小型文件的存储。对于大型文件的存储(比如超过16M),MongoDB 官方已经提供了成熟的产品 GridFS,读者朋友可以自行了解。
本文不会对 MongoDB 的概念、基本用法做过多的介绍,有兴趣的朋友可自行查阅其他文献,比如,笔者所著的《分布式系统常用技术及案例分析》一书,对 MongoDB 方面也有所着墨。
所需环境
本例子采用的开发环境如下:
MongoDB 3.4.4
Spring Boot 1.5.3.RELEASE
Thymeleaf 3.0.3.RELEASE
Thymeleaf Layout Dialect 2.2.0
Embedded MongoDB 2.0.0
Gradle 3.5
其中,Spring Boot 用于快速构建一个可独立运行的 Java 项目;Thymeleaf 作为前端页面模板,方便展示数据;Embedded MongoDB 则是一款由 Organization Flapdoodle OSS 出品的内嵌 MongoDB,可以在不启动 MongoDB 服务器的前提下,方面进行相关的 MongoDB 接口测试;Gradle 是一个类似于 Apache Maven 概念的新一代项目自动化构建工具。
有关 Spring Boot 的方面的内容,可以参阅笔者所著著的开源书《Spring Boot 教程》。有关 Thymeleaf 的方面的内容,可以参阅笔者所著著的开源书《Thymeleaf 教程》。有关 Gradle 的方面的内容,可以参阅笔者所著著的开源书《Gradle 3 用户指南》。
build.gradle
本文所演示的项目,是采用 Gradle 进行组织以及构建的,如果您对 Gradle 不熟悉,也可以自行将项目转为 Maven 项目。
build.gradle 文件内容如下:
该 build.gradle 文件中的各配置项的注释已经非常详尽了,这里就不再赘述其配置项的含义了。
领域对象
文档类 File
文档类是类似与 JPA 中的实体的概念。
文档类,主要采用的是 Spring Data MongoDB 中的注解,用于标识这是个 NoSQL 中的文档概念。
存储库 FileRepository
存储库用于提供与数据库打交道的常用的数据访问接口。其中 FileRepository 接口继承自
Spring Data MongoDB 会自动实现接口中的方法。
服务接口及实现类
FileService 接口定义了对于文件的 CURD 操作,其中查询文件接口是采用的分页处理,以有效提高查询性能。
FileServiceImpl 实现了 FileService 中所有的接口。
控制层/API 资源层
FileController 控制器作为 API 的提供者,接收用户的请求及响应。API 的定义符合 RESTful 的风格。有关 REST 相关的知识,读者可以参阅笔者所著的开源书《[REST 实战]》(https://github.com/waylau/rest-in-action)。
其中
安全配置
为了支持跨域请求,我们设置了安全配置类 SecurityConfig:
运行
有多种方式可以运行 Gradle 的 Java 项目。使用 Spring Boot Gradle Plugin 插件运行是较为简便的一种方式,只需要执行:
其他运行方式,请参阅笔者的开源书《Spring Boot 教程》
项目成功运行后,通过浏览器访问 http://localhost:8081 即可。首页提供了上传的演示界面,上传后,就能看到上传文件的详细信息:
相关上传的接口暴露在了 http://localhost:8081/ ,其中
GET /files/{pageIndex}/{pageSize} : 分页查询已经上传了的文件
GET /files/{id} : 下载某个文件
GET /view/{id} : 在线预览某个文件。比如,显示图片
POST /upload : 上传文件
DELETE /{id} : 删除文件
源码
MongoDB File Server 是一款开源的产品,完整的项目源码见 https://github.com/waylau/mongodb-file-server。
参考文献
原文同步至:https://waylau.com/mogodb-file-server-with-spring-boot/
《https://docs.mongodb.com/manual/core/gridfs/
《分布式系统常用技术及案例分析》:https://github.com/waylau/distributed-systems-technologies-and-cases-analysis
《Spring Boot 教程》:https://github.com/waylau/spring-boot-tutorial
《Thymeleaf 教程》:https://github.com/waylau/thymeleaf-tutorial
《Gradle 3 用户指南》:https://github.com/waylau/gradle-3-user-guide
《REST 实战》https://github.com/waylau/rest-in-action
https://github.com/waylau/mongodb-file-server
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
本文将介绍通过 MongoDB 存储二进制文件,从而实现一个文件服务器 MongoDB File Server。
文件服务器的需求
本文件服务器致力于小型文件的存储,比如博客中图片、普通文档等。由于MongoDB 支持多种数据格式的存储,对于二进制的存储自然也是不话下,所以可以很方便的用于存储文件。由于
MongoDB 的 BSON 文档对于数据量大小的限制(每个文档不超过16M),所以本文件服务器主要针对的是小型文件的存储。对于大型文件的存储(比如超过16M),MongoDB 官方已经提供了成熟的产品 GridFS,读者朋友可以自行了解。
本文不会对 MongoDB 的概念、基本用法做过多的介绍,有兴趣的朋友可自行查阅其他文献,比如,笔者所著的《分布式系统常用技术及案例分析》一书,对 MongoDB 方面也有所着墨。
所需环境
本例子采用的开发环境如下:
MongoDB 3.4.4
Spring Boot 1.5.3.RELEASE
Thymeleaf 3.0.3.RELEASE
Thymeleaf Layout Dialect 2.2.0
Embedded MongoDB 2.0.0
Gradle 3.5
其中,Spring Boot 用于快速构建一个可独立运行的 Java 项目;Thymeleaf 作为前端页面模板,方便展示数据;Embedded MongoDB 则是一款由 Organization Flapdoodle OSS 出品的内嵌 MongoDB,可以在不启动 MongoDB 服务器的前提下,方面进行相关的 MongoDB 接口测试;Gradle 是一个类似于 Apache Maven 概念的新一代项目自动化构建工具。
有关 Spring Boot 的方面的内容,可以参阅笔者所著著的开源书《Spring Boot 教程》。有关 Thymeleaf 的方面的内容,可以参阅笔者所著著的开源书《Thymeleaf 教程》。有关 Gradle 的方面的内容,可以参阅笔者所著著的开源书《Gradle 3 用户指南》。
build.gradle
本文所演示的项目,是采用 Gradle 进行组织以及构建的,如果您对 Gradle 不熟悉,也可以自行将项目转为 Maven 项目。
build.gradle 文件内容如下:
// buildscript 代码块中脚本优先执行buildscript { // ext 用于定义动态属性
该 build.gradle 文件中的各配置项的注释已经非常详尽了,这里就不再赘述其配置项的含义了。
领域对象
文档类 File
文档类是类似与 JPA 中的实体的概念。
import org.springframework.data.mongodb.core.mapping.Document;
文档类,主要采用的是 Spring Data MongoDB 中的注解,用于标识这是个 NoSQL 中的文档概念。
存储库 FileRepository
存储库用于提供与数据库打交道的常用的数据访问接口。其中 FileRepository 接口继承自
org.springframework.data.mongodb.repository.MongoRepository即可,无需自行实现该接口的功能,
Spring Data MongoDB 会自动实现接口中的方法。
import org.springframework.data.mongodb.repository.MongoRepository;import com.waylau.spring.boot.fileserver.domain.File;public interface FileRepository extends MongoRepository<File, String> {
服务接口及实现类
FileService 接口定义了对于文件的 CURD 操作,其中查询文件接口是采用的分页处理,以有效提高查询性能。
public interface FileService { /**
FileServiceImpl 实现了 FileService 中所有的接口。
@Servicepublic class FileServiceImpl implements FileService {
控制层/API 资源层
FileController 控制器作为 API 的提供者,接收用户的请求及响应。API 的定义符合 RESTful 的风格。有关 REST 相关的知识,读者可以参阅笔者所著的开源书《[REST 实战]》(https://github.com/waylau/rest-in-action)。
@CrossOrigin(origins = "*", maxAge = 3600) // 允许所有域名访问@Controllerpublic class FileController { @Autowired
其中
@CrossOrigin(origins = "*", maxAge = 3600)注解标识了 API 可以被跨域请求。为了能够启用该注解,仍然需要安全配置类的支持。
安全配置
为了支持跨域请求,我们设置了安全配置类 SecurityConfig:
@Configuration@EnableWebMvcpublic class SecurityConfig extends WebMvcConfigurerAdapter { @Override
运行
有多种方式可以运行 Gradle 的 Java 项目。使用 Spring Boot Gradle Plugin 插件运行是较为简便的一种方式,只需要执行:
$ gradlew bootRun
其他运行方式,请参阅笔者的开源书《Spring Boot 教程》
项目成功运行后,通过浏览器访问 http://localhost:8081 即可。首页提供了上传的演示界面,上传后,就能看到上传文件的详细信息:
相关上传的接口暴露在了 http://localhost:8081/ ,其中
GET /files/{pageIndex}/{pageSize} : 分页查询已经上传了的文件
GET /files/{id} : 下载某个文件
GET /view/{id} : 在线预览某个文件。比如,显示图片
POST /upload : 上传文件
DELETE /{id} : 删除文件
源码
MongoDB File Server 是一款开源的产品,完整的项目源码见 https://github.com/waylau/mongodb-file-server。
参考文献
原文同步至:https://waylau.com/mogodb-file-server-with-spring-boot/
《https://docs.mongodb.com/manual/core/gridfs/
《分布式系统常用技术及案例分析》:https://github.com/waylau/distributed-systems-technologies-and-cases-analysis
《Spring Boot 教程》:https://github.com/waylau/spring-boot-tutorial
《Thymeleaf 教程》:https://github.com/waylau/thymeleaf-tutorial
《Gradle 3 用户指南》:https://github.com/waylau/gradle-3-user-guide
《REST 实战》https://github.com/waylau/rest-in-action
https://github.com/waylau/mongodb-file-server
相关文章推荐
- 基于 MongoDB 及 Spring Boot 的文件服务器的实现
- 基于 MongoDB 及 Spring Boot 的文件服务器的实现
- 基于Spring Boot 2.0 及MongoDB 3.6.2 实现的简单文件共享服务器
- 基于SpringBoot上传任意文件功能的实现
- Java Springboot结合FastDFS实现文件上传以及根据图片url将图片上传至图片服务器
- 基于Spring Boot和Spring Cloud实现微服务架构学习(六)-Docker应用
- MongoDB基于GridFS实现文件的分布式存储
- MongoDB基于GridFS实现文件的分布式存储
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据!
- 基于spring-boot的web应用,ckeditor上传文件图片文件
- 基于Spring3 MVC实现基于form表单文件上传
- 基于Spring3 MVC实现基于HTML form表单文件上传
- 基于Spring3 MVC实现基于HTML form表单文件上传
- 基于Spring Boot和Spring Cloud实现微服务架构学习(三)-Spring Boot应用
- 基于Spring Boot和Spring Cloud实现微服务架构学习(五)-Docker总结
- 基于Spring3 MVC实现批量导出数据成Excel文件!
- 基于配置文件的工厂设计模式实现,并且做到对象的单例,类似于spring的ioc
- spring Quartz基于配置文件和注解的实现
- windows基于阿帕奇服务器,实现vc++文件下载功能
- 构建基于Nginx的文件服务器思路与实现