SpringBoot MongoDB GridFsTemplate实现文件管理

        1. 添加maven

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>

        2. 配置文件GridFsTemplate实现临时文件和正式文件存储桶分离

@Configuration
public class GridFsConfig {@Bean(name = "gridTempFsTemplate")public GridFsTemplate gridTempFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {return new GridFsTemplate(dbFactory, converter, "tempFs");}@Bean(name = "gridFormalFsTemplate")public GridFsTemplate gridFormalFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {return new GridFsTemplate(dbFactory, converter, "formalFs");}
}

        3. 创建GridFsTemplateUtil工具类管理文件的上传、下载和删除

@Slf4j
@Component
public class GridFsTemplateUtil {@Resource(name = "gridTempFsTemplate")private GridFsTemplate gridTempFsTemplate;@Resource(name = "gridFormalFsTemplate")private GridFsTemplate gridFormalFsTemplate;/*** 上传临时文件** @param file 文件* @return {@link String}*/public String saveTempFile(MultipartFile file, String fileName) {DBObject metaData = new BasicDBObject();metaData.put("createTime", new Date());metaData.put("createUser", SecurityContextUtils.getUserId());InputStream inputStream;try {inputStream = file.getInputStream();//文件流:inputStream//id:文件的唯一标识id//file.getContentType():内容类型//metaData:元数据return gridTempFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();} catch (IOException e) {log.error("上传失败", e);throw new MyException(ErrorCode.ERROR);}}/*** 上传临时文件** @param file 文件* @return {@link String}*/public String saveTempFile(MultipartFile file) {DBObject metaData = new BasicDBObject();metaData.put("createTime", new Date());metaData.put("createUser", SecurityContextUtils.getUserId());String fileName = file.getOriginalFilename();InputStream inputStream;try {inputStream = file.getInputStream();//文件流:inputStream//id:文件的唯一标识id//file.getContentType():内容类型//metaData:元数据return gridTempFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();} catch (IOException e) {log.error("上传失败", e);throw new MyException(ErrorCode.ERROR);}}/*** 上传正式文件** @param file 文件* @return {@link String}*/public String saveFormalFsFile(MultipartFile file) {DBObject metaData = new BasicDBObject();metaData.put("createTime", new Date());metaData.put("createUser", SecurityContextUtils.getUserId());String fileName = file.getOriginalFilename();InputStream inputStream;try {inputStream = file.getInputStream();//文件流:inputStream//id:文件的唯一标识id//file.getContentType():内容类型//metaData:元数据return gridFormalFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();} catch (IOException e) {log.error("上传失败", e);throw new MyException(ErrorCode.ERROR);}}/*** 上传正式文件** @param file 文件* @return {@link String}*/public String saveFormalFsFile(MultipartFile file, String fileName) {DBObject metaData = new BasicDBObject();InputStream inputStream;try {inputStream = file.getInputStream();//文件流:inputStream//id:文件的唯一标识id//file.getContentType():内容类型//metaData:元数据return gridFormalFsTemplate.store(inputStream, fileName, file.getContentType(), metaData).toString();} catch (IOException e) {log.error("上传失败", e);throw new MyException(ErrorCode.ERROR);}}/*** 获取临时文件** @param id 文件id* @return {@link GridFsResource}*/public GridFsResource getTempFile(String id) {log.info("Getting file.." + id);GridFSFile gridFsFile = gridTempFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));if (gridFsFile != null) {return gridTempFsTemplate.getResource(gridFsFile);}throw new MyException(ErrorCode.ERROR);}/*** 获取正式文件** @param id 文件id* @return {@link GridFsResource}*/public GridFsResource getFormalFile(String id) {log.info("Getting file.." + id);GridFSFile gridFsFile = gridTempFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));if (gridFsFile != null) {return gridFormalFsTemplate.getResource(gridFsFile);}throw new MyException(ErrorCode.ERROR);}/*** 删除临时文件** @param id 文件id*/public void deleteTempFile(String id) {gridTempFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(id)));}/*** 删除正式文件** @param id 文件id*/public void deleteFormalFile(String id) {gridFormalFsTemplate.delete(new Query().addCriteria(Criteria.where("_id").is(id)));}}

        4. 创建GridFsTemplateFileController控制器暴露上传、下载和删除接口

@Slf4j
@RestController
@RequestMapping("/gridFsFile")
@Api(tags = "上传文件控制器")
public class GridFsTemplateFileController  {@Autowiredprivate GridFsTemplateUtil gridFsTemplateUtil;/*** 上传临时文件** @param file 文件* @return {@link RespJson}*/@ApiOperation(value = "上传临时文件(mongodb)", notes = "上传临时文件(mongodb)")@PostMapping(value = "uploadTempFile", headers = "content-type=multipart/form-data")public RespJson<String> uploadTempFile(@RequestPart(value = "file") MultipartFile file) {return RespJson.success(gridFsTemplateUtil.saveTempFile(file));}/*** 上传正式文件** @param file 文件* @return {@link RespJson}*/@ApiOperation(value = "上传正式文件(mongodb)", notes = "上传正式文件(mongodb)")@PostMapping(value = "uploadFormalFile", headers = "content-type=multipart/form-data")public RespJson<String> uploadFormalFile(@RequestPart(value = "file") MultipartFile file) {return RespJson.success(gridFsTemplateUtil.saveFormalFsFile(file));}/*** 获取临时文件** @param id 文件id* @return {@link RespJson}*/@ApiOperation(value = "获取临时文件(mongodb)", notes = "获取临时文件(mongodb)")@GetMapping(value = "getTempFile")public ResponseEntity<InputStreamResource> getTempFile(HttpServletRequest request,HttpServletResponse response,@RequestParam String id) {try {GridFsResource tempFile = gridFsTemplateUtil.getTempFile(id);InputStream inputStream = tempFile.getInputStream();// 设置HTTP响应头HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + tempFile.getFilename());headers.add(HttpHeaders.CONTENT_TYPE, tempFile.getContentType());headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(Objects.requireNonNull(tempFile.getGridFSFile()).getLength()));// 返回文件流return ResponseEntity.ok().headers(headers).contentType(MediaType.parseMediaType(tempFile.getContentType())).body(new InputStreamResource(inputStream));}catch (Exception e){throw new MyException(ErrorCode.ERROR);}}/*** 获取正式文件** @param id 文件id* @return {@link RespJson}*/@ApiOperation(value = "获取正式文件(mongodb)", notes = "获取正式文件(mongodb)")@GetMapping(value = "getFormalFile")public ResponseEntity<InputStreamResource> getFormalFile(HttpServletRequest request,HttpServletResponse response,@RequestParam String id) {try {GridFsResource tempFile = gridFsTemplateUtil.getFormalFile(id);InputStream inputStream = tempFile.getInputStream();// 设置HTTP响应头HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + tempFile.getFilename());headers.add(HttpHeaders.CONTENT_TYPE, tempFile.getContentType());headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(Objects.requireNonNull(tempFile.getGridFSFile()).getLength()));// 返回文件流return ResponseEntity.ok().headers(headers).contentType(MediaType.parseMediaType(tempFile.getContentType())).body(new InputStreamResource(inputStream));}catch (Exception e){throw new MyException(ErrorCode.ERROR);}}/*** 删除临时文件** @param id 文件id* @return {@link RespJson}*/@ApiOperation(value = "删除临时文件(mongodb)", notes = "删除临时文件(mongodb)")@GetMapping(value = "deleteTempFile")public RespJson<Boolean> deleteTempFile(@RequestParam String id) {gridFsTemplateUtil.deleteTempFile(id);return RespJson.success();}/*** 获取正式文件** @param id 文件id* @return {@link RespJson}*/@ApiOperation(value = "获取正式文件(mongodb)", notes = "获取正式文件(mongodb)")@GetMapping(value = "deleteFormalFile")public RespJson<Boolean> deleteFormalFile(@RequestParam String id) {gridFsTemplateUtil.deleteFormalFile(id);return RespJson.success();}
}

        5.总结

        总体来说,GridFsTemplate提供了方便的API和高度可扩展的存储方案,使得在MongoDB中存储和检索大型文件变得更加容易和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科目二试题

int main() {int i 1;int j 0;while (i < 10) {i;if (i % 2 ! 0) {break;}j;}printf("%d %d\n", i, j);system("pause");return 0; }答案&#xff1a; 3 1int x 3;#define ADD(x,y) x * yint main() {int x 2;int y 3;int res ADD(x, y);printf…

QML android 采集手机传感器数据 并通过udp 发送

利用 qt 开发 安卓 app &#xff0c;采集手机传感器数据 并通过udp 发送 #ifndef UDPLINK_H #define UDPLINK_H#include <QObject> #include <QUdpSocket> #include <QHostAddress>class UdpLink : public QObject {Q_OBJECT public:explicit UdpLink(QObjec…

使用ExcelJS快速处理Node.js爬虫数据

什么是ExcelJS ExcelJS是一个用于处理Excel文件的JavaScript库。它可以让你使用JavaScript创建、读取和修改Excel文件。 以下是ExcelJS的一些主要特点&#xff1a; 支持xlsx、xlsm、xlsb、xls格式的Excel文件。可以创建和修改工作表、单元格、行和列。可以设置单元格样式、字…

leetcode:67. 二进制求和

题目&#xff1a; 函数原型&#xff1a; char * addBinary(char * a, char * b) 思路&#xff1a; 二进制相加&#xff0c;首先我们考虑先将字符串逆序。由此要写一个逆序函数reserve。字符串逆序后&#xff0c;从前往后相加&#xff0c;以较长的字符串的长度为标准长度n&#…

Nacos使用JavaSDK,Nacos 动态监听配置,Nacos动态发布配置,Nacos动态获取实例

文章目录 一、概述1、内置SDK2、服务配置管理工具&#xff1a;ConfigService3、服务注册与发现管理工具&#xff1a;NamingService 二、服务配置管理1、获取配置&#xff08;1&#xff09;描述&#xff08;2&#xff09;参数&#xff08;3&#xff09;请求示例 2、监听配置&…

Android | ADB 命令

Android Debug Bridge Android 调试桥&#xff0c;通过 C/S 的形式利用 PC 来操作 Android 设备&#xff0c;通过 ADB 可以利用 shell 直接操作真机或模拟器&#xff0c;比如传输文件、管理应用、拉取日志等。 常用的 ADB 指令 # 开启 ADB 服务 adb start-server# 停止 ADB …

可视化大屏设计模板 | 主题皮肤(报表UI设计)

下载使用可视化大屏设计模板&#xff0c;减少重复性操作&#xff0c;提高报表制作效率的同时也确保了报表风格一致&#xff0c;凸显关键数据信息。 软件&#xff1a;奥威BI系统&#xff0c;又称奥威BI数据可视化工具 所属功能板块&#xff1a;主题皮肤上传下载&#xff08;数…

阿里云k8s服务之间偶尔获取不到dns解析安装ACK NodeLocal DNSCache

1.背景 feign.RetryableException: No route to host (Host unreachable) executing POST http://osale-thirdparty/empty/detect 服务突然会中断&#xff0c;开发在看日志的时候会出现host找不到的情况&#xff0c;阿里云技术推荐安装dns缓存组件&#xff0c;加上这个组件会解…

Python实现机器学习(下)— 数据预处理、模型训练和模型评估

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本门课程将介绍人工智能相关概念&#xff0c;重点讲解机器学习原理机器基本算法&#xff08;监督学习及非监督学习&#xff09;。使用python&#xff0c;结合sklearn、Pycharm进行编程&#xff0c;介绍iris&#xff08;鸢尾…

Excel学习 WPS版

Excel学习 1.界面基础1.1 方格移动快捷键1.2 自动适配文字长度1.3 跨栏置中1.4 多个单元格同宽度&#xff1a;1.5 下拉框选择1.6 打印预览1.7 绘制边框1.8 冻结一行多行表头1.9 分割视图 2.日期相关2.1 今日日期快捷键2.2 月份提取 3.数学公式3.1 自动增长3.2 排序3.3 筛选3.4 …

ISCSI:后端卷以LVM 的方式配置 ISCSI 目标启动器

写在前面 准备考试整理相关笔记博文内容涉及使用 LVM 做ISCSI 目标后端块存储 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#…

数据结构——排序算法——冒泡排序

冒泡排序1 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void bubbleSort1(vector<int> arr) {for (int i 0; i < arr.size() - 1; i){for (int j 0; j < arr.size() - 1 - i; j){if (arr[j] > arr[j 1…

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…

java web中部署log4j.xml

标题&#xff1a;Java Web中部署log4j.xml 目录&#xff1a; 1. 介绍 2. 配置log4j.xml文件 3. 配置web.xml文件 4. 配置Spring框架 5. 配置Spring Bean 6. 总结 ## 1. 介绍 在Java Web开发中&#xff0c;日志记录是非常重要的一部分。log4j是一个常用的Java日志记录框架&am…

springboot整合redis-sentinel哨兵模式集群(二)

定义Redis操作工具类 package com.luxifa.util; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component…

人工智能:神经细胞模型到神经网络模型

人工智能领域中的重要流派之一是&#xff1a;从神经细胞模型&#xff08;Neural Cell Model&#xff09;到神经网络模型&#xff08;Neural Network Model&#xff09;。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型&#xff0c;它是由麦卡洛克、匹茨合作&#xff0…

Java-华为真题-预定酒店

需求&#xff1a; 放暑假了&#xff0c;小王决定到某旅游景点游玩&#xff0c;他在网上搜索到了各种价位的酒店&#xff08;长度为n的数组A&#xff09;&#xff0c;他的心理价位是x元&#xff0c;请帮他筛选出k个最接近x元的酒店&#xff08;n>k>0&#xff09;&#xff…

通常用哪些软件做数据可视化大屏?

一般就两种&#xff0c;一种是可视化大屏编辑软件&#xff0c;另一种则是BI系统&#xff08;BI数据可视化工具&#xff09;。考虑到数据来源多、数据量大以及数据分析效率、直观易懂性等实实在在的客观问题&#xff0c;建议采用BI系统来制作数据可视化大屏。 BI系统做可视化大…

关于2023年下半年计算机技术与软件专业技术资格(水平)考试报名工作有关事项的通知

各市(区)人力资源和社会保障局&#xff0c;省级各有关部门人事处&#xff0c;中央驻陕有关单位人事处&#xff0c;各位考生&#xff1a; 根据人力资源社会保障部办公厅《关于2023年度专业技术人员职业资格考试计划及有关事项的通知》&#xff08;人社厅发〔2023〕3号&#xff…

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录 一、JSR303 1、什么是JSR 303&#xff1f; 2、为什么要使用JSR 303&#xff1f; 3、JSR 303常用注解 3.1、常用的JSR 303注解 3.2、Validated与Valid区别 3.2.1、Validated 3.2.2、Valid 3.2.3、区别 4、使用案例 4.1、导入依赖 4.2、配置校验规则 4.3、编写…