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进行文件的操作的更多相关文章

  1. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  2. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...

  3. Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...

  4. 使用spring boot访问mongodb数据库

    一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...

  5. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

  6. Spring Boot 获取 java resources 下文件

    Spring Boot 获取 java resources 下文件 Spring Boot 获取 resources 目录下的目录(例:获取 resources 目录下的 template 目录): ...

  7. Spring Boot中的静态资源文件

    Spring Boot中的静态资源文件 1.SSM中的配置 2.Spring Boot 中的配置 2.1 整体规划 2.2 源码解读 2.3 自定义配置 2.3.1 application.prope ...

  8. Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. Spring Boot项目指定启动后执行的操作

    Spring Boot项目指定启动后执行的操作: (1)实现CommandLineRunner 接口 (2)重写run方法 (3)声明执行顺序@Order(1),数值越小,优先级越高 (4)如果需要注 ...

随机推荐

  1. 卷积网络可解释性复现 | Grad-CAM | ICCV | 2017

    觉得本文不错的可以点个赞.有问题联系作者微信cyx645016617,之后主要转战公众号,不在博客园和CSDN更新. 论文名称:"Grad-CAM: Visual Explanations ...

  2. 还在使用Future轮询获取结果吗?CompletionService快来了解下吧。

    背景 二胖上次写完参数校验(<二胖写参数校验的坎坷之路>)之后,领导一直不给他安排其他开发任务,就一直让他看看代码熟悉业务.二胖每天上班除了偶尔跟坐在隔壁的前端小姐姐聊聊天,就是看看这些 ...

  3. Keil4 uVision软件生成hex文件

    keil4下载地址:http://www.pc6.com/softview/SoftView_236836.html 按图操作即可,注意文件夹选择. 1.选择工程,选择第一个new uvision p ...

  4. webapplicationContext之ServletContext等相关概念说明

    1)ServletContext是一个全局的储存信息的空间,所有用户共用一个,其信息必须是线程安全且共享的. ServletContext有一个接口定义:ServletContext接口.此接口定义了 ...

  5. Dockerfile文件说明

    文件说明 此文件用于docker镜像文件的制作 基本结构 Dockerfile文件由行命令组成,以#开头注释行 一般分为四部分,基础镜像信息.维护者信息.镜像操作指令和容器启动执行指令. 例如 #De ...

  6. Apache伪静态(Rewrite).htaccess文件详解

    Htaccess(超文本访问)是一个简单的配置文件,它允许设计师,开发者和程序员通过它来改变Apache Web服务器的配置.这些功能包括用户重定向.URL重写(url rewrite,国内很多称为伪 ...

  7. 【原创】中断子系统-ARM GPIO中断处理流程

    目录 第一部分 GIC中断控制器的注册 1. GIC驱动分析 2.GIC驱动流程分析 第二部分 device node转化为platform_device 第三部分:platform_device注册 ...

  8. Syn_Flood攻击&防御手段

    Syn_Flood攻击原理 攻击者首先伪造地址对服务器发起SYN请求(我可以建立连接吗?),服务器就会回应一个ACK+SYN(可以+请确认).而真实的IP会认为,我没有发送请求,不作回应.服务器没有收 ...

  9. 【Flutter】功能型组件之对话框详解

    前言 对话框本质上也是UI布局,通常一个对话框会包含标题.内容,以及一些操作按钮,为此,Material库中提供了一些现成的对话框组件来用于快速的构建出一个完整的对话框. 接口描述 // 1. Ale ...

  10. 十五:SQL注入之oracle,Mangodb注入

    Access,Mysql,mssql,mangoDB,postgresql,sqlite,oracle,sybase JSON类型的数据注入: 键名:键值 {"a":"1 ...