SpringBoot2.x集成MongonDB gridFs实现文件的上传下载与常用API工具类

之前我们详细介绍了如何搭建、配置一个mongoDB服务器,今天主要就是介绍一下如何在我们的代码开发中去使用它了,不知道如何搭建的同学可以看一下之前的文章:MongonDB下载、安装(Windows)、配置详解

开始今天的内容:
首先新建一个Demo来实现今天的课程,新建项目过程不在介绍,大家自行百度即可

MongoDB gridFs集成

1) 引入依赖

   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
    </dependencies>
  1. 编写配置文件
server:
  port: 8088

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/netty?useSSL=false&serverTimezone=UTC&useUnicode=true
    username: root
    password: 123456
  #mongodb配置
  data:
    mongodb:
      host: localhost
      port: 27017
      database: test

mybatis:
  mapper-locations: classpath:/mapping/*.xml
  type-aliases-package: com.tl.model

3)新建配置类mongondbConfig

@Configuration
public class MongoConfig {

    @Autowired
    private MongoDbFactory mongoDbFactory;

    @Bean
    public GridFSBucket getGridFSBuckets() {
        MongoDatabase db = mongoDbFactory.getDb();
        return GridFSBuckets.create(db);
    }

}

4)实现使用 gridFs 上传/下载文件

@RestController
public class MongoController {

    @Autowired
    private GridFsTemplate gridFsTemplate;
    @Autowired
    private GridFSBucket gridFSBucket;
    
    @GetMapping("/filePush")
    public void filePush() throws FileNotFoundException {
        File file = new File("F:\\tupian\\test.jpg");
        System.out.println("文件路径:" + file.getPath());
        FileInputStream fio = new FileInputStream(file);
        ObjectId objectId = gridFsTemplate.store(fio,file.getName(), StandardCharsets.UTF_8);
        System.out.println("文件保存ID:" + objectId);

    }

    @GetMapping("/fileDel")
    public void fileDel() throws FileNotFoundException {
        String id = "5f056cd2c10f011ddc488514";
        Query query = Query.query(Criteria.where("_id").is(id));
        gridFsTemplate.delete(query);
    }

    @GetMapping("/getFile")
    public void getFile(HttpServletResponse response) throws Exception {
        String id = "5f056cd2c10f011ddc488514";
        Query query = Query.query(Criteria.where("_id").is(id));
        GridFSFile file = gridFsTemplate.findOne(query);
        if(null != file){
            GridFSDownloadStream in = gridFSBucket.openDownloadStream(file.getObjectId());
            GridFsResource resource = new GridFsResource(file,in);
            InputStream inputStream = resource.getInputStream();
            byte[] f = getBytes(inputStream);
            OutputStream out = response.getOutputStream();
            out.write(f);
        }
    }

    private byte[] getBytes(InputStream inputStream) throws  Exception{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int  i = 0;
        while (-1!=(i=inputStream.read(b))){
            bos.write(b,0,i);
        }
        return bos.toByteArray();
    }
}

== 至此我们就完成了SpringBoot集成MongoDB gridFs文件上传、下载功能==

MongoDB gridFs简介

GridFS用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。文件存储的一种方式,但是它是存储在MonoDB的集合中。会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

GridFS 用两个集合来存储一个文件:fs.filesfs.chunks
每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

以下是简单的 fs.files 集合文档:

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

以下是简单的 fs.chunks 集合文档:

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}
MongoDB 常用api工具类

因为MongoDB提供的方法较多,所以这里只是给大家提供一个常用api的工具类集成,有需要的同学可以自行添加其他api,本工具类主要实现对数据的CRUD操作

@Component
public class MongoDbUtil {

    @Autowired
    private static MongoTemplate mongoTemplate;

    /**
     * 保存数据对象
     * @param obj 集合为数据对象中@Document 注解所配置的collection
     */
    public static void save(Object obj){
        mongoTemplate.save(obj);
    }

    /**
     * 指定集合保存数据
     * @param obj 数据对象
     * @param collectionName 集合名
     */
    public static void save(Object obj,String collectionName){
        mongoTemplate.save(obj,collectionName);
    }

    /**
     * 根据数据对象ID删除数据
     * @param obj 数据对象
     */
    public static void remove(Object obj){
        mongoTemplate.remove(obj);
    }

    /**
     * 指定集合,根据数据对象ID删除数据
     * @param obj 数据对象
     * @param collName 集合名
     */
    public static void remove(Object obj,String collName){
        mongoTemplate.remove(obj, collName);
    }

    /**
     * 指定集合,根据key-value删除数据
     * @param key 数据对象
     * @param value 数据对象
     * @param collName 集合名
     */
    public static void removeById(String key,Object value,String collName){
        Criteria criteria = Criteria.where(key).is(value);
        criteria.and(key).is(value);
        Query query = Query.query(criteria);
        mongoTemplate.remove(query, collName);
    }

    /**
     * 指定集合修改数据,且仅修改找到的第一条数据
     * @param key 修改条件key
     * @param value 修改条件value
     * @param updateKeys 修改内容keys
     * @param updateValues 修改内容values
     * @param collName 集合名称
     */
    public static void updateFirst(String key,Object value
            ,String [] updateKeys,Object [] updateValues,String collName){
        Criteria criteria = Criteria.where(key).is(value);
        Query query = Query.query(criteria);
        Update update = new Update();
        for (int i = 0; i < updateKeys.length; i++) {
            update.set(updateKeys[i],updateValues[i]);
        }
        mongoTemplate.updateFirst(query,update,collName);
    }

    /**
     * 指定集合修改数据,且仅修改找到的所有数据
     * @param key 修改条件key
     * @param value 修改条件value
     * @param updateKeys 修改内容keys
     * @param updateValues 修改内容values
     * @param collName 集合名称
     */
    public static void updateMulti(String key,Object value
            ,String [] updateKeys,Object [] updateValues,String collName){
        Criteria criteria = Criteria.where(key).is(value);
        Query query = Query.query(criteria);
        Update update = new Update();
        for (int i = 0; i < updateKeys.length; i++) {
            update.set(updateKeys[i],updateValues[i]);
        }
        mongoTemplate.updateMulti(query,update,collName);
    }

    /**
     * 根据条件查询出所有结果集
     * @param obj 数据对象
     * @param keys 查询条件key
     * @param values 查询条件value
     */
    public static List<? extends Object> find(Object obj,String [] keys
            ,Object [] values){
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0){
                criteria = Criteria.where(keys[i]).is(values[i]);
            }else{
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        List<? extends Object> result = mongoTemplate.find(query,Object.class);
        return result;
    }

    /**
     * 根据条件查询出所有结果集
     * @param obj 数据对象
     * @param keys 查询条件key
     * @param values 查询条件value
     * @param collName 集合名
     */
    public static List<? extends Object> find(Object obj,String [] keys
            ,Object [] values,String collName){
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0){
                criteria = Criteria.where(keys[i]).is(values[i]);
            }else{
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        List<? extends Object> result = mongoTemplate.find(query,Object.class,collName);
        return result;
    }

    /**
     * 根据条件查询出所有结果集
     * @param obj 数据对象
     * @param keys 查询条件key
     * @param values 查询条件value
     * @param collName 集合名
     * @param sort 排序字段
     */
    public static List<? extends Object> find(Object obj,String [] keys
            ,Object [] values,String collName,String sort){
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0){
                criteria = Criteria.where(keys[i]).is(values[i]);
            }else{
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        query.with(new Sort(Sort.Direction.DESC, sort));
        List<? extends Object> result = mongoTemplate.find(query,Object.class,collName);
        return result;
    }

    /**
     * 根据条件查询出符合的第一条数据
     * @param obj 数据对象
     * @param keys 查询条件key
     * @param values 查询条件value
     */
    public static Object findOne(Object obj,String [] keys,Object [] values){
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0){
                criteria = Criteria.where(keys[i]).is(values[i]);
            }else{
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        Object result = mongoTemplate.findOne(query,Object.class);
        return result;
    }

    /**
     * 根据条件查询出符合的第一条数据
     * @param obj 数据对象
     * @param keys 查询条件key
     * @param values 查询条件value
     * @param collName 集合名
     */
    public static Object findOne(Object obj,String [] keys
            ,Object [] values,String collName){
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0){
                criteria = Criteria.where(keys[i]).is(values[i]);
            }else{
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        Object result = mongoTemplate.findOne(query,Object.class,collName);
        return result;
    }

    /**
     * 根据查询出所有数据
     * @param obj 数据对象
     */
    public static List<? extends Object> findAll(Object obj){
        List<? extends Object> result = mongoTemplate.findAll(obj.getClass());
        return result;
    }

    /**
     * 指定集合 查询出所有数据
     * @param obj 数据对象
     */
    public static List<? extends Object> findAll(Object obj,String collName){
        List<? extends Object> result = mongoTemplate.findAll(obj.getClass(),collName);
        return result;
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot与MongoDB的GridFS结合使用可以实现文件的存储和管理。GridFS是MongoDB提供的一种存储和检索大文件的机制,它将大文件切分成多个小文件块进行存储,同时提供了便捷的API进行文件的上下载、删除和查询操作。 要在Spring Boot中使用GridFS,首先需要添加MongoDB和GridFS的依赖。在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-gridfs</artifactId> </dependency> ``` 接下来,需要配置MongoDB的连接信息。在application.properties或application.yml文件中添加以下配置: ```properties spring.data.mongodb.uri=mongodb://localhost:27017/mydatabase ``` 然后,创建一个实体类来表示要存储的文件。可以使用Spring Data MongoDB提供的GridFsResource类来操作文件的上下载。下面是一个示例: ```java import org.springframework.data.mongodb.gridfs.GridFsResource; public class FileEntity { private String id; private String filename; private GridFsResource resource; // getters and setters } ``` 接下来,可以使用GridFsTemplate类来进行文件的上下载和查询操作。可以通过自动注入GridFsTemplate来使用它的方法。下面是一个示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值