GridFS存取模板文件

什么是GridFS?

GridFS介绍
GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成
开发。
它的工作原理是:
在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合
(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数
据信息(文件名称、块大小、上传时间等信息)。
从GridFS中读取文件要对文件的各各块进行组装、合并。

GridFS是持久化存储文件的模块,并不是以往仅仅储存一个文件名和地址,然后获取文件名和地址根据名字找到对应的本地文件展示。。。。。。它是把文件以二进制的形式分块进行持久化了


GridFS储存文件流程:
在这里插入图片描述
存储原理说明:
1、文件存储成功得到一个文件id
2、此文件id是fs.files集合中的主键。
3、可以通过文件id查询fs.chunks表中的记录,得到文件的内容。


GridFS取文件流程:
在这里插入图片描述
取出文件原理说明:
1、根据文件ID在chunks集合中查询到该模板相关的二进制文件
2、将相关二进制文件组装、合并,通过GridFSBucket对象打开下载流,获取文件流


文件取出的GridFSBucket配置

package com.xuecheng.manage_cms.config;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Huang
 * @version 1.0
 * @date 2020/3/30 16:48
 */
@Configuration
public class MongoConfig {
    //获取yml文件中的连接数据库
    @Value("${spring.data.mongodb.database}")
    String db;

    //根据连接的数据库获取相应的GridFSBucket对象
    //GridFSBucket的作用:用于打开下载流对象
    @Bean
    public GridFSBucket getGridFSBucket(MongoClient mongoClient){
        MongoDatabase database = mongoClient.getDatabase(db);
        GridFSBucket bucket = GridFSBuckets.create(database);
        return bucket;
    }
}

文件储存、取出、删除代码:

package com.xuecheng.manage_cms.dao;

import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author Huang
 * @version 1.0
 * @date 2020/3/30 15:21
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class GirdFsTest {
    @Autowired
    GridFsTemplate gridFsTemplate;

    @Autowired
    GridFSBucket gridFSBucket;

    //存文件
    @Test
    public void test01() throws FileNotFoundException {
        //获取模板文件的文件指针
        File file = new File("d:/index_banner.ftl");
        //用文件输入流获取对文件内容的操作
        FileInputStream fileInputStream = new FileInputStream(file);
        //GridFs将文件储存后返回ID,表示该文件数据的主键
        ObjectId objectId = gridFsTemplate.store(fileInputStream, "index_banner.ftl");
        //打印ID
        System.out.println("objectId:" + objectId);
    }

    //取文件
    @Test
    public void test02() throws IOException {
        //根据文件ID查询文件
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5e81a73142439429249fe6b4")));
        //打开一个下载流对象
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
        //创建gridFsResource,用于获取流对象
        GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
        //从流中读取数据
        String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
        //打印文件内容
        System.out.println(content);
    }

    //删除文件
    @Test
    public void testDelFile() throws IOException {
        //根据文件id删除fs.files和fs.chunks中的记录
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5e81a73142439429249fe6b4")));
    }

}

注:取出的文件是字符串形式,是页面模板的内容,此时可根据此模板字符串与数据模型结合形成静态页面------参考
FreeMarker自动页面静态化生成html文件https://blog.csdn.net/qq_42039738/article/details/105168742

发布了86 篇原创文章 · 获赞 1 · 访问量 4335

猜你喜欢

转载自blog.csdn.net/qq_42039738/article/details/105202080