Spring Boot使用MongoDB GridFS进行文件的操作
1. GridFS简介
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),但是它是存储在MonoDB的集合中。
GridFS 会将文件对象分割成多个的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。

每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename、content_type、还有用户自定义的属性)将会被存在files集合中。
以下是简单的 fs.files 集合文档:
{
"_id" : ObjectId("5de752d43f189c3260063ce9"), // 文件id
"filename" : "index_banner.ftl", // 文件名
"length" : NumberLong(1908), // 文件长度
"chunkSize" : 261120, // chunk的大小
"uploadDate" : ISODate("2019-12-04T14:31:48.487+08:00"), // 上传时间
"md5" : "a8d14fbafebfca33c8abdac2b83840cc", // 文件的md5值
"contentType" : "text/plain" // 文件的MIME类型
}
以下是简单的 fs.chunks 集合文档:
{
"_id" : ObjectId("5de752d43f189c3260063cea"), // chunk的id
"files_id" : ObjectId("5de752d43f189c3260063ce9"), // 文件id,对应fs.files中对象id
"n" : 0, // 文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
"data" : "Mongo Binary Data" // 文件的二进制数据
}
2.代码示例
代码基于spring boot,主要实现GridFS的基本操作。
(1)pom.xml中引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
(2)application.yml配置
spring:
data:
mongodb:
uri: mongodb://localhost:27017
database: note_test
(3)基本操作
package com.maybesuch.controller; import com.mongodb.client.gridfs.model.GridFSFile;
import org.apache.commons.io.IOUtils;
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.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; /**
* @author : maybesuch
* @version : 1.0
* @Description : GridFS文件基本操作
* @Date : 2020/1/8 10:16
* @Copyright : Copyright (c) 2020 All Rights Reserved
**/
@RestController
@RequestMapping("/gridfs")
public class GridFSController { @Autowired
private GridFsTemplate gridFsTemplate; /**
* 上传文件
*
* @param multipartFile 文件
* @return 上传成功文件id
*/
@PostMapping("/upload")
public String uploadFile(@RequestParam(value = "file") MultipartFile multipartFile) { // 设置meta数据值
Map<String, String> metaData = new HashMap<>();
metaData.put("tags", "test");
// ...
try (
InputStream inputStream = multipartFile.getInputStream();
) {
// 获取文件的源名称
String fileName = multipartFile.getOriginalFilename();
// 进行文件存储
ObjectId objectId = gridFsTemplate.store(inputStream, fileName, metaData);
// 返回文件的id
return objectId.toHexString(); } catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 获取文件信息
* @param fileId 文件id
*/
@GetMapping("/get/{fileId}")
public void getFile(@PathVariable("fileId") String fileId) { //根据id查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId))); if (gridFSFile == null) {
throw new RuntimeException("No file with id: " + fileId);
}
//获取流对象
GridFsResource resource = gridFsTemplate.getResource(gridFSFile); /*可根据实际需求进行数据的获取*/
try {
//获取流中的数据
String content = IOUtils.toString(resource.getInputStream(), "UTF-8");
//获取byte[]信息
byte[] bytes = IOUtils.toByteArray(resource.getInputStream()); } catch (IOException e) {
e.printStackTrace();
}
} /**
* 删除文件
* @param fileId 文件id
*/
@DeleteMapping("/delete")
public void deleteFile(@RequestParam(value = "fileId") String fileId) {
// 根据文件id删除fs.files和fs.chunks中的记录
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId))); } }
Spring Boot使用MongoDB GridFS进行文件的操作的更多相关文章
- springboot(十一):Spring boot中mongodb的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用
http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用
MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...
- 使用spring boot访问mongodb数据库
一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...
- Spring Boot 在接收上传文件时,文件过大异常处理问题
Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...
- Spring Boot 获取 java resources 下文件
Spring Boot 获取 java resources 下文件 Spring Boot 获取 resources 目录下的目录(例:获取 resources 目录下的 template 目录): ...
- Spring Boot中的静态资源文件
Spring Boot中的静态资源文件 1.SSM中的配置 2.Spring Boot 中的配置 2.1 整体规划 2.2 源码解读 2.3 自定义配置 2.3.1 application.prope ...
- Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Spring Boot项目指定启动后执行的操作
Spring Boot项目指定启动后执行的操作: (1)实现CommandLineRunner 接口 (2)重写run方法 (3)声明执行顺序@Order(1),数值越小,优先级越高 (4)如果需要注 ...
随机推荐
- 在GitHub里面如何删除库
GitHub是一个面向开源及私有软件项目的托管平台,今天将为大家介绍如何在GitHub中彻底删除一个代码仓库. 在GitHub里面如何删除库 1.先进入个人仓库里面 2.点击进入你想要的删除的库 3. ...
- SonarQube学习(一)- 使用Docker安装SonarQube(亲测可用)
一.前言 不得不吐槽下,现在的博客写的真太扯淡了,就网上写的使用docker安装SonarQube而言,搜到十篇文章,最少9篇照着操作配置都不可用,卡在SonarQube无法启动.自然,我也是被折磨的 ...
- 解决面具magisk刷入模块卡开机问题
手机刷入面具模块出现卡开机第二屏,在reccovery模式下,点击高级(advanced)->文件管理(File Manager)->data->adb->modules删掉对 ...
- vue watch监听不到对象,探究 watch 原理
最近使用vue watch时,在某些模块监听不到对象的改变,无法触发回调函数. 解决: 使用watch监听对象时,只能监听到该对象初始化时已存在的key值. 如下例监听user对象,在初始化时没有ag ...
- 根据租户id获取部门树状结构有父子结构的数据list
/** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...
- 快速沃尔什变换 (FWT)学习笔记
证明均来自xht37 的洛谷博客 作用 在 \(OI\) 中,\(FWT\) 是用于解决对下标进行位运算卷积问题的方法. \(c_{i}=\sum_{i=j \oplus k} a_{j} b_{k} ...
- 数据库零基础之---了解数据库的事务[ACID]
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 我们先举一个例子来描述一下事务: 假设要张三通过银行给李四进行转账1000元钱,张三原有余额10000元整,李四有人民币 ...
- vue中的插值操作
mustache语法 1.将data的文本数据插入至html语句中,使用mustache语法. v-once指令 2.在某些情况下,我们不希望界面随意的跟随改变,这个时候我们可以使用v-once的指令 ...
- 如何下载youtube的视频?
导言 当youtube视频需要下载时,发现需要会员等其他限制 别急,下面就是比较稳定的方法 准备 gitub链接 youtube-dl github 官网链接 官网 按照官网提示下载对应版本 我这里是 ...
- 【MySQL 高级】知识拓展
MySQL高级 知识拓展 MySQL高级 知识拓展 数据量 和 B+树 的关系 事务隔离级别集底层原理MVCC 唯一索引和普通索引的关键不同点 MRR:multi range read 练习和总结