今天主要为大家带来SpringBoot工程中MongodbGFS的简单使用。首先,我们的思路是,用表单提交文件,直接将文件存入Mongodb数据库中,然后将文件直接从数据库下载到客户端。当然我们用的是GFS结构的存储,因此我们的文件最好大于16M以上。这也与mongodb官方的建议相一致。这里还有不清楚的可以看我之前的一篇博客《MongodbGFS存储大文件》,链接。
首先我们做一下准备工作,初始化一个SpringBoot工程。这里我继续使用的是gradle。
添加我们需要的依赖,spring-boot-starter-test 用gradle初始化springboot工程时默认添加了,除了这个我们需要添加额外的两个依赖就是,spring-boot-starter-data-mongodb和spring-boot-starter-thymeleaf(模板引擎用来生成网页)。
添加了依赖之后,我们需要进行配置mongodb,thymeleaf。具体的配置说明可以查看官方文档 mongodb使用说明,模板引擎在springboot中的配置。
这里可以看一下我的配置文件。
#thymeleaf start
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
#thymeleaf end
#mongodb start
spring.data.mongodb.uri=mongodb://39.106.177.24:27017/zhaotong
#mongodb end
#uploadfile start
spring.http.multipart.max-file-size=1024000KB
spring.http.multipart.max-request-size=2048000KB
#uploadfile end
关于mongodb uri的具体格式,我建议是直接去看源码:
下面的同时也配置了让springmvc放开文件大小的限制,因为我们主要做的是大文件上传。
接下来我们学习一下Springboot提供给我们关于 mongodb的操作工具类。主要我们看3个类:MongoTemplate.class MongodbFactory.class GridFsTemplate.class
首先mongoFacory 其实就和hibernateFactory一样为我们提供基于Mongodb的会话工厂。这里我们看源码:
它主要给我们返回DB对象,这里要说明这个类是线程安全的,为什么是线程安全的呢?我们接着来看DB这个类
很明显DB是线程安全的,那么工厂如何让提供给我们的的db是线程安全的呢?所以就有了接下来这段代码:
大家可以看到了ConcurrentHashMap出现了,所以这里希望大家多看看源代码,是有好处的。
至于MongoTemplate.class 这个类其实和jdbcTemplate扮演的角色一样,这里就不多说了,我们今天主要用到的是GridFsTemplate.class。我们看这个类的源码,我们今天所使用的方法都是来源于这个类。
/*
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the Licen