SpringBoot使用mongoDB的GridFs进行上传文件,下载文件,删除文件等操作

最近在写一个项目,用到了mongoDB存储文件的模块GridFs,记录一下。

GridFs总结:GridFs是mongoDB存储文件一个模块,将文件分块进行存储,文件会按照256K的大小分割成多个块,每一块都生成一条记录存入mongoDB数据库的fs.chunks集合中,每一条记录都是对应文件的二进制数据。然后将文件的一些信息存放到fs.files集合中,如文件名称、上传时间、文件大小等。

  1. 创建配置类,创建bean并注入到容器中,作用是连接指定mongoDB数据库并打开下载流。
    db绑定的是配置文件中配置的mongoDB的数据库名称
    SpringBoot使用mongoDB的GridFs进行上传文件,下载文件,删除文件等操作_第1张图片
  2. 测试代码如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class GridFsTest {

    @Autowired
    GridFsTemplate gridFsTemplate;

    @Autowired
    GridFSBucket gridFSBucket;

    /**
     * GridFs存储文件的测试
     * 将文件按大小256k分割存到mongodb数据库
     * 将分割后的文件分记录存到fs.files表
     * 将完整文件信息存到fs.chunks表
     *
     * @throws FileNotFoundException
     */
    @Test
    public void testGridFs() throws FileNotFoundException {
        //获取要存储的文件
        File file = new File("D:/index_banner.html");
        //将要存储的文件写入输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        //文件开始存储
        ObjectId objectId = gridFsTemplate.store(fileInputStream, "轮播图测试文件01", "");
        //获取存储的文件id
        String fileId = objectId.toString();
        System.out.println(fileId);
    }


    /**
     * GridFs读取文件的测试
     * 读取数据库中的文件,以字符形式展示
     *
     * @throws IOException
     */
    @Test
    public void getFile() throws IOException {
        //根据文件id查询文件
        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5a7719d76abb5042987eec3a")));
        //使用GridFsBucket打开一个下载流对象
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
        //创建GridFsResource对象,获取流
        GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
        //从流中取数据
        String s = IOUtils.toString(gridFsResource.getInputStream(), "UTF-8");
        System.out.println(s);
    }

    /**
     * GridFs删除文件的测试
     */
    @Test
    public void deleteFile(){
        //根据文件id删除fs.files表和fs.chunks表中的记录
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5d833df93ca78f04a8f3d8cb")));
    }
    
}
  1. 使用mongoDB的图形化工具Studio 3T操作文件。
    文件的数据被存放到集合fs.chunks中,打开该集合,找到data字段,即为存放的具体数据,可以导入和导出数据。
    导入数据的注意项:导入数据之后,数据长度改变,要更新fs.files表中对应的length字段数据
    SpringBoot使用mongoDB的GridFs进行上传文件,下载文件,删除文件等操作_第2张图片
    SpringBoot使用mongoDB的GridFs进行上传文件,下载文件,删除文件等操作_第3张图片

你可能感兴趣的:(mongoDB)