目錄
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
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo-monogo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-monogo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
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")));
}
}