本文来说下MongoDB中的GridFsTemplate介绍以及基本使用

文章目录

  • GridFsTemplate概述
  • 利用mongodb保存图片/文件/视频两种方式
  • bson二进制简介
  • GridFS简介
  • 程序实例
  • 本文小结

GridFsTemplate概述

GridFsTemplate中封装了一些对GridFs的增删改查操作,本文写几个实例来测试下


利用mongodb保存图片/文件/视频两种方式

利用mongodb保存图片/文件/视频 两种方式

  1. 一种是将图片数据转化为bson二进制作为字典的键值对进行保存
  2. 利用mongodb提供的GridFS进行保存


bson二进制简介

BSon是Binary JSON的简称,是一种类Json的一种二进制形式的存储格式 , 主要被MongoDB(目前一个较为流行的非关系数据模型的开源数据库)使用于存储数据和网络数据交换。


GridFS简介

1 GridFS是MongoDB中存储和查询超过BSON文件大小限制(16M)的规范

2 不像BSON文件那样在一个单独的文档中存储文件,GridFS将文件分成多个块,每个块作为一个单独的文档。默认情况下,每个GridFS块是255kB,意味着除了最后一个块之外(根据剩余的文件大小),文档被分成多个255kB大小的块存储。

3 GridFS使用两个集合保存数据,一个集合存储文件块 (fs.files ),另外一个存储文件元数据 ( fs.chunks )

  • fs.files这个集合中存储的是每一个上传到数据库的文档的信息
  • fs.chunks这个集合存储的是上传文件的内容。一个chunk相当于一个文档(大文件被拆分成多个有序的chunk)

4 当从GridFS中获取文件时,MongoDB的驱动程序负责将多个块组装成完整文件 , 以通过GridFS进行范围查询,可以访问文件的任意部分(例如跳到视频文件或者音频文件的任意位置)


程序实例

maven导入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

yaml文件配置

spring:data:mongodb:host: localhost   #同127.0.0.1port: 27017database: test    #指定操作的数据库servlet:multipart:max-file-size: 200MB #单个文件上传大小max-request-size: 400MB #连续上传文件大小

返回值响应

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author* 返回值类*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseBean<T> {private Integer code;private String msg;private T data;}

config配置,文件下载需要使用

@Configuration
public class MongoConfig {@Value("${spring.data.mongodb.database}")private String db;@Beanpublic GridFSBucket getGridFSBucket(MongoClient mongoClient){MongoDatabase mongoDatabase = mongoClient.getDatabase(db);GridFSBucket bucket = GridFSBuckets.create(mongoDatabase);return bucket;}
}

使用GridFsTemplate来进行文件的上传,下载,删除,以及基本的信息查询操作

@Slf4j
@RestController
@RequestMapping("/api/file/mongodb")
@Api(tags = "文件上传至mongodb数据库开发测试")
public class FileCommonController {@Autowiredprivate GridFsTemplate gridFsTemplate;@Autowiredprivate GridFSBucket gridFSBucket;/*** 通用上传单个* 文件请求*/@SneakyThrows@PostMapping("/uploadSingleFile")@ApiOperation(value = "上传单个文件")public ResponseBean<?> uploadSingleFile(MultipartFile file) {// 新文件名String originalFilename = file.getOriginalFilename();// 获得文件输入流InputStream ins = file.getInputStream();// 获得文件类型String contentType = file.getContentType();// 将文件存储到mongodb中,mongodb将会返回这个文件的具体信息
//        ObjectId objectId = gridFsTemplate.store(ins, originalFilename, contentType);// 上传文件中我们也可以使用DBObject附加一些属性DBObject  metadata = new BasicDBObject();metadata.put("hello","word");ObjectId objectId = gridFsTemplate.store(ins, originalFilename, contentType, metadata);log.info(objectId.toString());log.info("接收文件:" + originalFilename);//返回信息return new ResponseBean<>(200, "上传成功", objectId.toString());}@ApiOperation(value = "使用MongoDB的ID来获得文件的基本信息")@GetMapping(value = "/getFileInfoById")public ResponseBean<?> getFileInfoById(@RequestParam(name = "file_id") String fileId) {Query query = Query.query(Criteria.where("_id").is(fileId));GridFSFile gridFSFile = gridFsTemplate.findOne(query);String value = (String)gridFSFile.getMetadata().get("hello");log.info("==============================>" + value);if(gridFSFile == null){log.info("文件不存在");return new ResponseBean<>(400, "fail", "文件不存在");}//返回信息return new ResponseBean<>(200, "success", gridFSFile.toString());}@ApiOperation(value = "使用MongoDB的ID来删除文件")@GetMapping(value = "/deleteFileById")public ResponseBean<?> deleteFileById(@RequestParam(name = "file_id") String fileId) {Query query = Query.query(Criteria.where("_id").is(fileId));// 删除之前先看文件是否存在GridFSFile gridFSFile = gridFsTemplate.findOne(query);if(gridFSFile == null){log.info("文件删除失败,文件不存在");return new ResponseBean<>(400, "删除失败", "文件不存在");}gridFsTemplate.delete(query);log.info("文件删除成功");//返回信息return new ResponseBean<>(200, "删除成功", gridFSFile.toString());}@ApiOperation(value = "使用MongoDB的ID来下载文件")@GetMapping(value = "/downloadFileById")@SneakyThrowspublic byte[] downloadFileById(@RequestParam(name = "file_id") String fileId, HttpServletResponse response)  {Query query = Query.query(Criteria.where("_id").is(fileId));GridFSFile gridFSFile = gridFsTemplate.findOne(query);// 解决文件下载的时候,中文乱码的问题String name = new String(gridFSFile.getFilename().getBytes("GBK"), "ISO-8859-1");response.setHeader("Content-Disposition", "attachment;fileName=" + name);GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());//创建gridFsResource,用于获取流对象GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);log.info(gridFSFile.getFilename() + "=======>下载成功!!");return IOUtils.toByteArray(gridFsResource.getInputStream());}}

文件测试,程序中的这几个接口都是测试过的

navicat查看文件


本文小结

本文介绍了使用GridFsTemplate来进行简单的文本操作,文件上传,文件下载等。

GridFsTemplate介绍以及基本使用相关推荐

  1. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  2. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  3. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  4. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  5. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  6. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

  7. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  8. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

  9. Tensorrt一些优化技术介绍

    Tensorrt一些优化技术介绍 Figure 1. A quantizable AveragePool layer (in blue) is fused with a DQ layer and a ...

最新文章

  1. .net excel循环插数据_科普:1根、2根、4根内存条插在主板内存插槽的位置
  2. 零基础Unreal Engine 4(UE4)图文笔记之粒子系统
  3. 如何删除第一张单页_单页网站-网站建设中独有的风景线
  4. 2019年网络规划设计师上午真题及答案解析
  5. CF1067D Computer Game
  6. python判断图片类型_python模块之imghdr检测图片类型
  7. k8s部署nexus3
  8. css里禁用样式,禁用某些元素的CSS样式
  9. 3dmax模型在web端
  10. pycharm专业版的破解
  11. 守护进程杀手(测试)
  12. BAPI_FIXEDASSET_OVRTAKE_CREATE 创建资产并折旧
  13. Python实现qq自动发送消息
  14. Java 根据贷款年限对应的不同利率计算月供
  15. 4G网络要升级成5G,换卡还是换手机?
  16. cmd中的循环语句for
  17. Lenet、Alexnet 、VGG、 GoogleNet、ResNet模型
  18. 主动降噪在服务器中的应用,AirPods Pro主动降噪功能有多大用处?主动降噪耳机适用范围详解!...
  19. OpenCVSharp学习(五):关于摄像头的操作,打开,拍照,录视频
  20. Mac虚拟机镜像安装Windows系统

热门文章

  1. SUPERSET使用笔记
  2. 海量数据下的存储技术,哪些模式靠得住?
  3. php 自定义 $_SERVER
  4. Java线程面试题TOP50
  5. [Leetcode]-- Valid Number
  6. 微成本搭建企业高效沟通平台
  7. 数据库冷备份和热备份
  8. shell-script(command groups)
  9. 采用动态解析设置***
  10. Delphi使用server组件控制excel的一点经验