java gridfs_GridFS文件操作
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文件操作相关推荐
- Java本地文件操作
概述:Java本地文件操作,涉及到文件/文件夹的创建,文件/文件夹属性的读取与设置,文件/文件夹的重命名,目录结构的遍历,以及文件内容的读取与写入. File属于java.io.File. ---在E ...
- java中文件,java中文件操作大全
java中文件操作大全 一.获得控制台用户输入的信息 view plaincopy to clipboardprint? / //获得控制台用户输入的信息 return throws ioexcept ...
- java中文件操作的工具类
代码: package com.lky.pojo;import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...
- java io文件操作_java IO 文件操作方法总结
java IO 文件操作方法总结 对于输入输出的理解: 输入输出,以程序为参考点,外部数据进入程序,通过输入流完成.程序将数据给外部设备,通过输出流完成. 文件Io的操作 //获取文件 File fi ...
- java底层 文件操作_JAVA的文件操作【转】
11.3 I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程 ...
- java api教程_Java api 入门教程 之 JAVA的文件操作
I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本 ...
- java底层 文件操作,java底层是怎的对文件操作的
一.序言 IO操作,才程序中比较普遍,JAVA 中提出了IO/NIO 的概念,也一直在说NIO 比IO快,一直不知道原因,就想memcache 和ehcache 比较优劣一样,这些东西得自己看看如何实 ...
- android java 写文件操作_Android编程之文件的读写实例详解
本文实例分析了Android编程之文件的读写方法.分享给大家供大家参考,具体如下: Android的文件读写与JavaSE的文件读写相同,都是使用IO流.而且Android使用的正是JavaSE的IO ...
- Java中文件操作和IO
目录 一.文件 1.1 文件的概念 1.2 文件的路径 1.2.1 绝对路径 1.2.2 相对路径 1.3 文件的分类 二.Java中操作文件 案例1 案例2 案例3 案例5 案例6 三.文件的读写- ...
最新文章
- 可伸缩系统的设计模式(译)
- AI破解古文字登Nature封面:修复缺失文字,精确地理位置和书写时间,DeepMind哈佛谷歌多家联手开发...
- python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解
- 事件驱动程序设计_简单的事件驱动设计
- 【Elasticsearch】Elasticsearch-Hadoop打通Elasticsearch和Hadoop
- 破解数字游戏 —— 概率篇
- 用arp-scan扫描局域网IP地址
- 网卡驱动程序igb和ixgbe
- network secruity studay day4
- python画图配色_python matplotlib包图像配色方案
- 爱荷华大学计算机科学专业,爱荷华大学计算机科学
- linux控制NVme硬盘点灯,一种实现多NVMe硬盘背板点灯的设计方法与流程
- 什么是大数据?2022大数据时代
- 文件传输协议FTP/TFTP/SSH/SCP——应用层
- 备考CSP刷题经验总结
- 【机器视觉】移动机器人控制软件的设计与实现
- 学习日记(1.12)
- PotgreSQL 11 新特性之智能分区连接/聚合
- 微软ML.NET 0.10版分离处理表格数据增.NET生态系互操作性
- 20220310-nlp-text-data-augmentation