MongoDB入门学习(二)GridFS、GridFS整合SpringBoot

article/2025/10/14 14:03:59

文章目录

  • GridFS
    • GridFS简介
    • GridFS存储原理
  • GridFS整合SpringBoot
    • 新增store()
    • 查询与下载find()、findOne()
    • 删除delete()
  • Demo案例

GridFS

GridFS简介

GridFS是MongoDB的一个用来存储/获取大型数据(图像、音频、视频等类型的文件)的规范。相当于一个存储文件的文件系统,但它的数据存储在MongoDB的集合中。GridFS能存储超过文档大小(16MB)限制的文件。
GridFS将文件分解成块,将每块数据保存在不同的文档中,每块大小最大为255KB。

GridFS存储原理

GridFS使用两个集合(collection)存储文件。一个集合是chunks,用于存储文件内容的二进制数据,一个集合是files,用于存储文件的元数据。
GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因:

  1. 存储巨大的文件,如视频、图片等。
  2. 利用GridFS简化需求。
  3. GridFS会直接利用已经建立的复制或分片机制,故障恢复和扩展容易。
  4. GridFS可以避免用户上传内容的文件系统出现问题。
  5. GridFS不产生磁盘碎片。

GridFS使用俩个表来存储数据:

  1. files:包含元数据对象(如文件的名称、上传的时间)
  2. chunks:包含其他一些相关信息的二进制块
    在这里插入图片描述
    fs.files集合存储文件的元数据,以类的json文档格式存储。每在GridFS存储一个文件,则会在fs.files集合中生成一个文档。
    fs.filse集合中文档的存储内容如下:
{"_id": <ObjectId>,		//(必填)文档ID,唯一标识"chunkSize": <num>,		//(必填)chunk大小 256kb"uploadDate": <timestamp>,	//(必填)文件第一次上传时间"length": <num>,	//(必填)文件长度"md5": <string>,	//(必填)文件md5的值"filename": <string>,		//(可选)文件名"contentType":<string> ,	//(可选)文件的MIME类型"metadata": <dataObject>		//(可选)文件自定义的信息
}

fs.chunks集合存储文件内容的二进制数据,以类json格式文档形式存储。每在GridFS存储一个文件,GridFS就会将文件内容按照chunksize大小分成多个文件块,然后将文件按照类json格式存储到chunks集合中,每个文件块对应fs.chunk集合中一个文档。一个存储文件会对应一个到多个chunk文档。
fs.chunks集合中文档的存储内容如下:

{"_id": <ObjectId>,	// (必填)文档唯一表示"files_id": <ObjectId>,	//(必填)对应fs.files文档的ID"n": <num>,	// (必填)序号,表示文件的第几个chunk"data": <binary>	// (必填)文件二进制数据
}

GridFS整合SpringBoot

新增store()

@Autowired
private GridFsTemplate gridFsTemplate;
@Autowired
private GridFSBucket gridFSBucket;
@Test
public void test_insert() throws FileNotFoundException {File file = new File("G:\\test.txt");ObjectId objId = gridFsTemplate.store(new FileInputStream(file), "测试.txt", "txt");System.out.println(objId.toString());
}

查询与下载find()、findOne()

@Test
public void test_read() throws IOException {System.out.println("============ 查询所有文件 ==============");GridFSFindIterable files = gridFsTemplate.find(new Query());files.forEach(f -> {System.out.println(f.toString());});System.out.println("============ 根据ID查找文件 ==============");String fileId = "63b97c1c9b7cf822eeac502a";GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));System.out.println(file.toString());System.out.println("============ 查找到对应的文件,读取文件 ==============");GridFSDownloadStream stream = gridFSBucket.openDownloadStream(file.getObjectId());GridFsResource gridFsResource = new GridFsResource(file, stream);InputStream inputStream = gridFsResource.getInputStream();this.fileOutPut(inputStream, gridFsResource.getFilename());
}
private void fileOutPut(InputStream inputStream, String filename) throws IOException {File f1 = new File("G:\\test\\" + filename);if (f1.exists()) f1.getParentFile().mkdir();FileOutputStream fos = new FileOutputStream(f1);byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {fos.write(bytes, 0, len);}inputStream.close();fos.close();
}

删除delete()

 @Testpublic void test_delete(){String fileId = "63b97c1c9b7cf822eeac502a";gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));}

Demo案例

package com.hx.demo1.controller;import com.mongodb.client.gridfs.GridFSFindIterable;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.bson.BsonValue;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsOperations;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;/*** @author Huathy* @date 2023-01-08 00:19* @description*/
@RestController
@RequestMapping(value = "file", method = {RequestMethod.GET, RequestMethod.POST})
public class FileController {@AutowiredGridFsOperations gridFsOperations;/*** 上传文件* @param file* @return* @throws IOException*/@RequestMapping(value = "upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public Map<String, ObjectId> insert(@RequestPart(value = "file") MultipartFile file) throws IOException {//开始时间long begin = System.nanoTime();Map<String, ObjectId> map = new HashMap<>();InputStream streamForUpload = file.getInputStream();ObjectId objectId = gridFsOperations.store(streamForUpload, file.getOriginalFilename(), file.getContentType(), "测试上传");//上传结束long time = System.nanoTime() - begin;System.out.println("本次上传共耗时: " + time);System.out.println("上传成功!文件名: " + file.getOriginalFilename() + ". 文件ID: " + objectId);map.put(file.getOriginalFilename(), objectId);return map;}/*** 获取所有文件的ID* @return*/@RequestMapping("/allFiles")public ArrayList<Object> findAllFiles() {GridFSFindIterable gridFSFiles = gridFsOperations.find(new Query());ArrayList<Object> ids = new ArrayList<>();gridFSFiles.forEach(f -> {BsonValue bsonValue = f.getId();ids.add(bsonValue.toString());});return ids;}/*** 根据ID下载文件* @param id        mongoDB的文件ID* @param response* @return* @throws IOException*/@RequestMapping("/download")public String download(String id, HttpServletResponse response) throws IOException {GridFSFile file = gridFsOperations.findOne(Query.query(Criteria.where("_id").is(id)));if (file != null) {GridFsResource resource = gridFsOperations.getResource(file);response.reset();response.setContentType(resource.getContentType());response.setHeader("Content-Disposition", "attachment;filename=" + resource.getFilename());ServletOutputStream ops = response.getOutputStream();InputStream ips = resource.getInputStream();int len = 0;byte[] bytes = new byte[1024];while ((len = ips.read(bytes)) != -1) {ops.write(bytes, 0, len);}ips.close();ops.close();return resource.getContentType();}throw new RuntimeException("没有找到相关文件");}/*** 删除文件* @param id    mongodb的文件ID* @return*/@GetMapping("/delete")public String deleteFile(String id){gridFsOperations.delete(Query.query(Criteria.where("_id").is(id)));return "delete success";}}

测试结果:
在这里插入图片描述在这里插入图片描述


http://chatgpt.dhexx.cn/article/nhGJ2owF.shtml

相关文章

MongoDB之GridFS

【MongoDB是什么&#xff1f;】 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它…

Python操作mongo--GridFS

业务场景&#xff1a; 通过python查询mongo数据库中所存储的图片 条件&#xff1a; 查询上传日期大于等于2022-03-04的图片并保存到本地 度娘了好多文章&#xff0c;发现除了疯狂的套娃有用的信息很少&#xff0c;于是有了此文章&#xff0c;&#xff0c;理解不了的可以结合截…

Mongodb操作GridFS案例

文章目录 准备环境Navicat中查看GridFS存储桶登录连接查看 准备环境 开启服务 mongod -f /opt/servers/mongodb_demo/mongodb/conf/mongod.conf 关闭防火墙 systemctl stop firewalld.service 查看防火墙的状态 systemctl status firewalld.service 进入mongo shell mongo …

MongoDB中的GridFs是什么

本文来介绍下MongoDB的GridFsTemplate如何使用 文章目录 什么是GridFS为什么要使用GridFSGridFS的两个集合本文小结 什么是GridFS GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。GridFS是MongoDB中的一个内置功能&#xff0c;可以用…

GridFS文件存储

GridFS文件存储 使用命令行操作GridFS 提前创建好文件 1.上传文件 现在我们使用 GridFS 的 put 命令来存储 GridFS存储.ppt文件。 调用 MongoDB 安装目录下bin的mongofiles.exe工具。 打开命令提示符&#xff0c;进入到MongoDB的安装目录的bin目录中&#xff0c;找到mongof…

GridFs的初步了解

前言 刚刚接触到了MongoDB的分布式文件存储系统GridFs&#xff0c;以前没了解过&#xff0c;这里记录一下它的简单使用。 1、GridFs介绍 GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。 GridFS 用于存储和恢复那些超过16M&#x…

2023 mongodb GridFS整合SpringBoot

接了个&#xff0c;为了节约成本以及提高开发效率&#xff0c;文件存储和数据存储都用的是mongodb&#xff0c;网上找了一大堆gridfs的案例&#xff0c;发现都不好用&#xff0c;嗯&#xff0c;&#xff0c;&#xff0c;自己动手写吧&#xff0c;仅供参考。 核心pom配置 ser…

GridFS文件操作

1. GridFS介绍 GridFS是MongoDB提供的用于持久化存储文件的模块&#xff0c;CMS使用MongoDB存储数据&#xff0c;使用GridFS可以快速集成 开发。 它的工作原理是&#xff1a; 在GridFS存储文件是将文件分块存储&#xff0c;文件会按照256KB的大小分割成多个块进行存储&#xf…

MongoDB GridFS

GridFS简介 GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案&#xff0c;通常用来处理大文件&#xff0c;对于MongoDB的BSON格式的数据(文档)存储有尺寸限制&a…

GridFS详细分析

GridFS简介 GridFS是MongoDB中的一个内置功能&#xff0c;可以用于存放大量小文件。 http://www.mongodb.org/display/DOCS/GridFS http://www.mongodb.org/display/DOCS/GridFSSpecification GridFS使用 MongoDB提供了一个命令行工具mongofiles可以来处理GridFS&#xff…

13.MongoDB之Gridfs

参照官网如下(如下链接依次递进)&#xff1a; https://docs.mongodb.com/manual/core/gridfs/ https://docs.mongodb.com/database-tools/mongofiles/#mongodb-binary-bin.mongofiles https://docs.mongodb.com/database-tools/installation/installation/ FS&#xff1a;即文…

MongoDB(四)——GridFS

GridFS MongoDB的一个重要子模块&#xff0c;可基于MongoDB来持久存储文件&#xff0c;并且支持分布式存储和读取。 持久存储&#xff1a;对应瞬时数据如内存&#xff0c;指保存到数据库中&#xff0c;能持久保存。 分布式存储&#xff1a;将数据分散地存储于多个位置。 存在的…

在Keil MDK中无法使用gmtime函数进行时间戳转换

硬件平台STM32&#xff0c;软件平台Keil MDK 5.18 由于项目中需要用到UNIX时间戳和日历的来回转换&#xff0c;于是想到C库函数<time.h>里面有现成的函数可以使用。 于直接使用mktime和gmtime两个函数进行时间戳转换&#xff0c;前者把日历转为时间戳&#xff0c;后者把…

C++中获取日期函数gmtime和localtime区别

函数gmtime和localtime的声明如下&#xff1a; struct tm * gmtime (const time_t * timer); struct tm * localtime (const time_t * timer); 它们均接收一个time_t的const指针类型&#xff0c;time_t类型通常是一个大整数值&#xff0c;该整数值表示自UTC时间1970年1月1日0…

C语言学习笔记---时间函数ctime()和gmtime()

函数原型如下&#xff1a; __CRT_INLINE char *__cdecl ctime(const time_t *_Time);__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time);ctime函数 ctime函数可以将当前时间值转换为字符串格式返回。返回的字符串格式为&#xff1a;Www Mmm dd hh:mm:ss yyyy 其中&…

Linux系统编程一:时间和延时、gmtime和localtime函数返回相同

目录 1. 概述2. 延时函数3. 当前时间3.1 时间调用函数3.2 时间转换函数 4. gmtime和localtime函数返回相同测试代码 1. 概述 前面的几篇文章Linux学习笔记一到七&#xff0c;主要是开发环境的搭建&#xff0c;都是一些准备工作。从本篇文章开始&#xff0c;将学习Linux系统编程…

逆向 time.h 函数库 time、gmtime 函数

0x01 time 函数 函数原型&#xff1a;time_t time(time_t *t)函数功能&#xff1a;返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间&#xff0c;以秒为单位。如果 seconds 不为空&#xff0c;则返回值也存储在变量 seconds 中C\C 实现&#xff1a; #include <stdio.…

python gmtime_在Python中操作日期和时间之gmtime()方法的使用

在Python中操作日期和时间之gmtime()方法的使用 这篇文章主要介绍了在Python中操作日期和时间之gmtime()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 gmtime()方法转换历元到一struct_time以UTC其中dst的标志值始终为0以秒表示时间。如果不设置秒时或None&a…

gmtime与localtime的区别

目录 gmtime函数 linux环境下&#xff1a; window环境下 localtime函数 gmtime函数 gmtime转换的时间是UTL时间&#xff0c;与北京时间相差了8个小时 如果你想要得到北京时间&#xff0c;不建议你将gmtime转换后的时间直接加上八个小时 linux环境下&#xff1a; 执行结…

【C库函数】strerror函数详解

目录 strerror 函数原型 参数详解 返回值详解 函数讲解 strerror 返回错误码&#xff0c;所对应的错误信息 函数原型 char *strerror( int errnum ); 参数详解 参数errnum解析错误码信息(errno) 返回值详解 strerror函数就是返回这些错误码所对应错误信息的字符串起始地…