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)如果需要注 ...
随机推荐
- Centos7 根目录存储空间扩展方法
Centos7 根目录存储空间扩展方法 一.首先通过 df -hl 命令查看磁盘占用情况,其中根目录已经被占满,此时需要对其进行扩容 二.针对虚拟机环境的centos7系统根存储空间扩容,可利 ...
- idea2020 没有 Autoscroll from Source
2018版本: 2020版本: 最后在官网的网站中找到了解决方案,原来是改名了: 网址:https://intellij-support.jetbrains.com/hc/en-us/communit ...
- ElasticSearch设置用户名密码访问
版本号:7.3.1 1.需要在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启. xpack.security.enabl ...
- 用Margin还是用Padding的区别
用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时 ...
- 自动化运维工具-Ansible之6-Jinja2模板
自动化运维工具-Ansible之6-Jinja2模板 目录 自动化运维工具-Ansible之6-Jinja2模板 Ansible Jinja2模板概述 Ansible Jinja2模板使用 Ansib ...
- dalao高精
#ifndef MY_BIGN_H#define MY_BIGN_H 1#pragma GCC system_header#include<cstring>#include<algo ...
- ROS开源小车TurtleBot3详情介绍
您为什么要选择ROS开源智能小车 ROS(Robot Operating System,机器人操作系统)是目前世界上更主流更多人使用的的机器人开源操作系统.它可以提供操作系统应有的服务,包括硬件抽象, ...
- String StringBuffer StringBuilder之间的区别
String:
- ssh 免密设置
在master中生成dsa: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/author ...
- Flink SQL 核心概念剖析与编程案例实战
本次,我们从 0 开始逐步剖析 Flink SQL 的来龙去脉以及核心概念,并附带完整的示例程序,希望对大家有帮助! 本文大纲 一.快速体验 Flink SQL 为了快速搭建环境体验 Flink SQ ...