Spring Boot使用GridFS实现文件的上传和下载方式

网友投稿 1004 2022-11-29

Spring Boot使用GridFS实现文件的上传和-方式

Spring Boot使用GridFS实现文件的上传和-方式

目录使用GridFS实现文件的上传和-首先了解一下怎么用命令操作GridFS使用Spring Boot操作GridFSSpring Boot中使用GridFS什么是GridFS在SpringBoot中使用GridFS

使用GridFS实现文件的上传和-

在这篇博客中,我们将展示如何使用Spring Boot中使用mongodb自带的文件存储系统GridFS实现文件的上传和-功能

首先了解一下怎么用命令操作GridFS

安装mongodb

sudo apt-get install mongodb

安装完成后找到mongofiles的位置

whereis mongofiles

找到之后进入目录就可以上传文件了

mongofiles put /home/ubuntu/Desktop/1.jpg

这时文件就添加成功了,进入mongodb查看

mongo

show dbs # 发现多了一个gridfs

use gridfs

db.fs.files.find() # 存放文件的一些基本信息

db.fs.chunks.find() # 存放文件二进制内容,一个文件有多个fs.chunks,每个fs.chunks都有一个,files_id与fs.files中的id相对应,形成多对一的关系,文件存的时候分开存,取的时候再合并

使用Spring Boot操作GridFS

引入依赖

org.springframework.boot

spring-boot-starter-data-mongodb

commons-io

commons-io

2.4

controller代码

import com.mongodb.BasicDBObject;

import com.mongodb.DBObject;

import com.mongodb.client.gridfs.GridFSBucket;

import com.mongodb.client.gridfs.GridFSDownloadStream;

import com.mongodb.client.gridfs.GridFSFindIterable;

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

import org.apache.commons.io.IOUtils;

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

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

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

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

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

import java.io.InputStream;

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

import static org.springframework.data.mongodb.gridfs.GridFsCriteria.whereFilename;

@RestController

public class ImageController {

@Autowired

private GridFsTemplate gridFsTemplate;

@Autowired

private GridFsOperations operations;

@Autowired

private GridFSBucket gridFSBucket;

@PostMapping("file/upload")

public ImageResponse upload(@RequestParam("file") MultipartFile file) {

DBObject metaData = new BasicDBObject();

// 把时间戳作为文件名存入mongodb

String fileName = String.valueOf(System.currentTimeMillis());

InputStream inputStream = null;

try {

inputStream = file.getInputStream();

gridFsTemplate.store(inputStream, fileName, "image", metaData);

} catch (IOException e) {

throw new RuntimeException();

}

return new ImageResponse(fileName);

}

@GetMapping(value = "file/download/${fileName}", produces = MediaType.IMAGE_JPEG_VALUE)

@ResponseBody

public byte[] getImage(@PathVariable("fileName") String fileName) throws IOException {

if (fileName == null) {

return null;

}

// 根据文件名查询(也可以根据md5值等信息查询)

GridFSFindIterable result = operations.find(query(whereFilename().is(fileName)));

GridFSFile gridFSFile = result.first();

GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());

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

GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);

return IOUtils.toByteArray(gridFsResource.getInputStream());

}

}

加入一个配置

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;

}

}

图片返回的实体类

public class ImageResponse implements Serializable {

private String imageName;

public ImageResponse(String imageName) {

this.imageName = imageName;

}

public String getImageName() {

return imageName;

}

public void setImageName(String imageName) {

this.imageName = imageName;

}

}

配置文件

spring:

data:

mongodb:

uri: mongodb://localhost:27017/gridfs

database: gridfs

Spring Boot中使用GridFS

什么是GridFS

GirdFS是MongoDB提供的用于持久化存储文件的模块

在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合 (collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数 据信息(文件名称、块大小、上传时间等信息)。

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

在SpringBoot中使用GridFS

存储文件

@Autowired

GridFsTemplate gridFsTemplate;

@Test

public void GridFsTest() throws FileNotFoundException {

//选择要存储的文件

File file = new File("/Users/xxx/Desktop/xxx.docx");

InputStream inputStream = new FileInputStream(file);

//存储文件并起名称

ObjectId objectId = gridFsTemplate.store(inputStream, "面试宝典");

String id = objectId.toString();

//获取到文件的id,可以从数据库中查找

System.out.println(id);

}

查找文件

创建GridFSBucket对象

@Configuration

public class MongoConfig {

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

String db;

@Bean

public GridFSBucket getGridFSBucket(MongoClient mongoClient){

MongoDatabase mongoDatabase = mongoClient.getDatabase(db);

GridFSBucket bucket = GridFSBuckets.create(mongoDatabase);

return bucket;

}

}

@Autowired

GridFsTemplate gridFsTemplate;

@Autowired

GridFSBucket gridFSBucket;

@Test

public void queryFile() throws IOException {

String id = "5c1b8fac72884e389ae3df82";

//根据id查找文件

GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));

//打开-流对象

GridFSDownloadStream gridFS = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());

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

GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFS);

//获取流中的数据

String string = IOUtils.toString(gridFsResource.getInputStream(), "UTF-8");

System.out.println(string);

}

删除文件

//删除文件

@Test

public void testDelFile() throws IOException {

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

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

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:RTK-Mannual-3 配置RTKNAVI以及RTKPOST的定位选项
下一篇:HTML的复习
相关文章

 发表评论

暂时没有评论,来抢沙发吧~