1. GridFS介绍

GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用MongoDB存储数据,使用GridFS可以快速集成

开发。

它的工作原理是:

在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合

(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。

从GridFS中读取文件要对文件的各各块进行组装、合并。

详细参考:https://docs.mongodb.com/manual/core/gridfs/

2. GridFS 存取文件测试

2.1 新建项目配置pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.2.2.RELEASE

com.example

demo-monogo

0.0.1-SNAPSHOT

demo-monogo

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-data-mongodb

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

org.springframework.boot

spring-boot-maven-plugin

2.2 在application.yml配置mongodb

spring:

data:

mongodb:

uri: mongodb://root:root@localhost:27017

database: xc_cms

2.3 GridFS存取文件测试

1、存文件

使用GridFsTemplate存储文件测试代码:

向测试程序注入GridFsTemplate。

package com.example.demomonogo;

import org.bson.types.ObjectId;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.data.mongodb.gridfs.GridFsTemplate;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

@SpringBootTest

class DemoMonogoApplicationTests {

@Autowired

GridFsTemplate gridFsTemplate;

@Test

public void testGridFs() throws FileNotFoundException {

//要存储的文件

File file = new File("D:\\test\\user_selected.png");

//定义输入流

FileInputStream inputStram = new FileInputStream(file);

//向GridFS存储文件

ObjectId objectId = gridFsTemplate.store(inputStram, "user_selected.png", "image/png");

//得到文件ID

String fileId = objectId.toString();

System.out.println(fileId);

}

}

文件以及成功被存入到GridFS

2.4 读取文件

1)在config包中定义Mongodb的配置类,如下:

GridFSBucket用于打开下载流对象

package com.example.demomonogo.config;

/**

* @author john

* @date 2019/12/21 - 10:39

*/

import com.mongodb.MongoClient;

import com.mongodb.client.MongoDatabase;

import com.mongodb.client.gridfs.GridFSBucket;

import com.mongodb.client.gridfs.GridFSBuckets;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class MongoConfig {

@Value("${spring.data.mongodb.database}")

String db;

@Bean

public GridFSBucket getGridFSBucket(MongoClient mongoClient) {

MongoDatabase database = mongoClient.getDatabase(db);

GridFSBucket bucket = GridFSBuckets.create(database);

return bucket;

}

}

2)测试代码如下

package com.example.demomonogo;

import com.mongodb.client.gridfs.GridFSBucket;

import com.mongodb.client.gridfs.GridFSDownloadStream;

import com.mongodb.client.gridfs.model.GridFSFile;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

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 java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

@SpringBootTest

class DemoMonogoApplicationTests {

@Autowired

GridFsTemplate gridFsTemplate;

@Autowired

GridFSBucket gridFSBucket;

@Test

public void queryFile() throws IOException {

String fileId = "5dfd851306322e6b12057a40";

//根据id查询文件

GridFSFile gridFSFile =

gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));

//打开下载流对象

GridFSDownloadStream gridFSDownloadStream =

gridFSBucket.openDownloadStream(gridFSFile.getObjectId());

//创建gridFsResource,用于获取流对象

GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);

//获取流中的数据

InputStream inputStream = gridFsResource.getInputStream();

File f1 = new File("D:\\test\\get.png");

if (!f1.exists()) {

f1.getParentFile().mkdirs();

}

byte[] bytes = new byte[1024];

// 创建基于文件的输出流

FileOutputStream fos = new FileOutputStream(f1);

int len = 0;

while ((len = inputStream.read(bytes)) != -1) {

fos.write(bytes, 0, len);

}

inputStream.close();

fos.close();

}

}

2.5 删除文件

package com.example.demomonogo;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.data.mongodb.gridfs.GridFsTemplate;

import java.io.IOException;

@SpringBootTest

class DemoMonogoApplicationTests {

@Autowired

GridFsTemplate gridFsTemplate;

//删除文件

@Test

public void testDelFile() throws IOException {

//根据文件id删除fs.files和fs.chunks中的记录

gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5dfd851306322e6b12057a40")));

}

}

java gridfs_GridFS文件操作相关推荐

  1. Java本地文件操作

    概述:Java本地文件操作,涉及到文件/文件夹的创建,文件/文件夹属性的读取与设置,文件/文件夹的重命名,目录结构的遍历,以及文件内容的读取与写入. File属于java.io.File. ---在E ...

  2. java中文件,java中文件操作大全

    java中文件操作大全 一.获得控制台用户输入的信息 view plaincopy to clipboardprint? / //获得控制台用户输入的信息 return throws ioexcept ...

  3. java中文件操作的工具类

    代码: package com.lky.pojo;import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...

  4. java io文件操作_java IO 文件操作方法总结

    java IO 文件操作方法总结 对于输入输出的理解: 输入输出,以程序为参考点,外部数据进入程序,通过输入流完成.程序将数据给外部设备,通过输出流完成. 文件Io的操作 //获取文件 File fi ...

  5. java底层 文件操作_JAVA的文件操作【转】

    11.3 I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程 ...

  6. java api教程_Java api 入门教程 之 JAVA的文件操作

    I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本 ...

  7. java底层 文件操作,java底层是怎的对文件操作的

    一.序言 IO操作,才程序中比较普遍,JAVA 中提出了IO/NIO 的概念,也一直在说NIO 比IO快,一直不知道原因,就想memcache 和ehcache 比较优劣一样,这些东西得自己看看如何实 ...

  8. android java 写文件操作_Android编程之文件的读写实例详解

    本文实例分析了Android编程之文件的读写方法.分享给大家供大家参考,具体如下: Android的文件读写与JavaSE的文件读写相同,都是使用IO流.而且Android使用的正是JavaSE的IO ...

  9. Java中文件操作和IO

    目录 一.文件 1.1 文件的概念 1.2 文件的路径 1.2.1 绝对路径 1.2.2 相对路径 1.3 文件的分类 二.Java中操作文件 案例1 案例2 案例3 案例5 案例6 三.文件的读写- ...

最新文章

  1. 可伸缩系统的设计模式(译)
  2. AI破解古文字登Nature封面:修复缺失文字,精确地理位置和书写时间,DeepMind哈佛谷歌多家联手开发...
  3. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解
  4. 事件驱动程序设计_简单的事件驱动设计
  5. 【Elasticsearch】Elasticsearch-Hadoop打通Elasticsearch和Hadoop
  6. 破解数字游戏 —— 概率篇
  7. 用arp-scan扫描局域网IP地址
  8. 网卡驱动程序igb和ixgbe
  9. network secruity studay day4
  10. python画图配色_python matplotlib包图像配色方案
  11. 爱荷华大学计算机科学专业,爱荷华大学计算机科学
  12. linux控制NVme硬盘点灯,一种实现多NVMe硬盘背板点灯的设计方法与流程
  13. 什么是大数据?2022大数据时代
  14. 文件传输协议FTP/TFTP/SSH/SCP——应用层
  15. 备考CSP刷题经验总结
  16. 【机器视觉】移动机器人控制软件的设计与实现
  17. 学习日记(1.12)
  18. PotgreSQL 11 新特性之智能分区连接/聚合
  19. 微软ML.NET 0.10版分离处理表格数据增.NET生态系互操作性
  20. 20220310-nlp-text-data-augmentation

热门文章

  1. Jupyter 魔术命令(magic commands)
  2. 二战生的考研经验分享(一)个人经历
  3. Android 上架谷歌市场
  4. Oracle 授权用户只能查看几张表
  5. Python统计文件夹下文件的个数
  6. java-后台生成图表、并将图表保存为PNG图片
  7. DESTOON B2B网站管理系统V7.0正式版发布
  8. 成功解决:Oracle中文乱码问题(很详细,很详细,很详细)
  9. 卷积层(convolutional layer)
  10. 工作流管理系统开发之六 表单权限与流程的权限控制