java gridfs_GridFS文件操作

1. GridFS介绍

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

开发。

它的工作原理是:

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

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

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

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

82d0fda72117145f02b840197a936643.png

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);

}

}

a55e6f6ef1838d8f762c221d0095ebb0.png

a82a15aab11849bdbdc6fc25483bdcf5.png

文件以及成功被存入到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();

}

}

e3ede7f1eb162820caae6dfa796601e0.png

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")));

}

}

b6d04b7c052f848c3e3deaf04c7b89a7.png

e693ba78766d875e68b601fc4a5bd1c3.png


版权声明:本文为weixin_32886135原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。