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)如果需要注 ...
随机推荐
- AndroidSDK安装选项说明
前言:本文的目的在于了解AndroidSDK相关安装选项,正确根据自身需要选择性安装,避免安装过多无用的东西导致硬盘爆满. 1. AndroidSDK安装选项说明,如上图. 2. 实际游戏打包使用到A ...
- feig中调用其他微服务接口无反应
1.调用微服务时get请求接口中不能使用@RequestBody注解,不然接口调用无反应.post接口中可以使用@RequestBody注解
- 【Mongodb】后台主键_id自增(Java版本)
ObjectId的选择 创建MongoDB文档时,如果没有赋值ID,系统会自动帮你创建一个,通常会在客户端由驱动程序完成.得到的ObjectId类似于这种 ObjectId使用12字节的存储空间, ...
- 虚拟机安装Ubuntu 16.04系统实操教程 详尽步骤 vmware ESXi亲测通过
1 Ubuntu 16.04系统安装要求 Ubuntu 16.04 LTS下载最新版本的Ubuntu,适用于台式机和笔记本电脑. LTS代表长期支持,这意味着有五年免费安全和维护更新的保证. Ubun ...
- 改进你的c#代码的5个技巧(二)
在本文中,我将向你展示c#编程的5个最佳实践.我从日常编程经验中学到了这些实践.我在release模式下测试了所有的代码,并在开发环境稳定后进行了截屏.我想你会喜欢这些建议的. 在使用数据类型之前选择 ...
- linux IP 注释
DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是"逻辑名". IPADDR=addr, 这里addr是IP地址. NETMASK=ma ...
- 浅谈.NET技术公司的实习生培养
浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...
- js如何替换字符串中匹配到多处中某一指定节点?
抛出一个问题,如图,搜索关键字,匹配到四处,那我鼠标放在第二处,我想把它变个颜色,该怎么实现呢?回到文章的标题,js如何替换字符串中匹配到多处中某一指定节点? 字符串的替换,我们首先想到的一个属性是r ...
- 基于Jmeter实现Rocketmq消息发送
在互联网企业技术架构中,MQ占据了越来越重要的地位.系统解耦.异步通信.削峰填谷.数据顺序保证等场景中,到处都能看到MQ的身影. 而测试工程师在工作中,也经常需要和mq打交道,比如构造测试数据,触发某 ...
- java进阶(31)--TreeSet集合、TreeMap集合、自平衡二叉树
一.TreeSet集合简单 1.TreeSet集合底层是一个TreeMap 2.TreeMap集合底层是一个二叉树 3.放到TreeSet集合的元素等同于放到TreeMap集合的Key部分 4.Tre ...