当前位置: 首页 > article >正文

【实战指南】用MongoDB存储文档和图片等大文件(Java实现)

一、前言

在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文件拆分成多个小块进行存储,同时支持文件元数据管理,为大文件的存储和读取提供了高效、灵活的解决方案。本文将详细介绍如何使用 Java 语言结合 MongoDB 的 GridFS 来实现大文件的存储、读取和删除操作。

 

二、环境准备

1. 安装 MongoDB

首先,你需要在本地或者服务器上安装 MongoDB 数据库。可以从 MongoDB 官方网站 下载适合你操作系统的版本,并按照官方文档进行安装和配置。

 

2. 配置 Java 项目

在你的 Java 项目中,需要添加 MongoDB Java 驱动依赖。如果你使用的是 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

xml

<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.9.1</version>
</dependency>

 

如果你使用的是 Gradle 项目,可以在 build.gradle 文件中添加以下依赖:

groovy

implementation 'org.mongodb:mongodb-driver-sync:4.9.1'

 

三、GridFS 存储原理

GridFS 是 MongoDB 提供的一种用于存储大文件的规范,它将大文件拆分成多个小块(chunks)进行存储,默认每个块的大小为 255KB。GridFS 使用两个集合来存储文件数据:

 

  • fs.files:存储文件的元数据,如文件名、大小、类型、上传时间等。
  • fs.chunks:存储文件的二进制块数据。

 

文件的每个块都会被分配一个唯一的 ID,并且在 fs.files 集合中会记录每个文件对应的所有块的信息。这样,在读取文件时,可以根据元数据信息依次读取各个块,然后将它们合并成完整的文件。

 

四、Java 代码实现

1. 连接 MongoDB 数据库

java

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;public class MongoDBConnection {private static final String CONNECTION_STRING = "mongodb://localhost:27017";private static final String DATABASE_NAME = "fileDB";public static GridFSBucket getGridFSBucket() {// 创建 MongoDB 客户端MongoClient mongoClient = MongoClients.create(CONNECTION_STRING);// 获取指定数据库MongoDatabase database = mongoClient.getDatabase(DATABASE_NAME);// 创建 GridFSBucket 实例,用于操作 GridFSreturn GridFSBuckets.c

相关文章:

【实战指南】用MongoDB存储文档和图片等大文件(Java实现)

一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...

Jetpack Compose 显示时间

Jetpack Compose 显示时间 介绍主体代码使用 介绍 在软件中实时显示时间 主体代码 import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStat…...

vue3中,通过获取路由上的token直接进入首页,跳过登录页面

1.需求 A系统想快速进入到B系统&#xff0c;但又不想输入账号密码&#xff0c;A系统的token与B系统共用token&#xff0c;因此在访问B系统就会在路径上携带token&#xff08;https://magictool-box.com/login?token《token》&#xff09;&#xff0c;通过token直接进入B系统首…...

软考通关利器:中级软件设计师结构化开发核心考点

简介&#xff1a; 作为国家软考中级认证的核心科目&#xff0c;“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点&#xff0c;深度解析需求建模、结构化分析方法&#xff08;SA/SD&#xff09;、模块设计原则、数据流图&#xff08;DFD&#…...

[思考记录]两则:宏观视角、理想化

#宏观视角# 昨天听金老师讲解了他初步整理的大模型宏观概念关系图&#xff0c;受益不少。图上不仅是涵盖了诸多概念&#xff0c;更厉害的应该在于把概念之间的关系进行了描述&#xff0c;更直观展现了概念是如何与其他概念相互作用的。帮助从整体的角度去理解&#xff0c;以及透…...

MySQL 性能优化方向

MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...

3-22 vector的使用详解---STL C++

C中的vector容器展开系统讲解&#xff0c;具体内容如下&#xff1a; 1. vector的定义和特性&#xff08;基础概念&#xff09; 讲解vector作为动态数组的核心特性&#xff1a;自动内存管理、动态扩容机制&#xff08;倍增策略&#xff09;对比普通数组&#xff1a;支持随机访…...

Collectors.toList / list 转 list

前言 略 Collectors.toList List<User> userList ...; List<Long> userIdList userList.stream().map(User::getUserId).collect(Collectors.toList());...

uniapp 和 webview 之间的通信

1.背景 应用使用了uniapp开发跨端应用&#xff0c;在uniapp中内嵌webview页面实现页面热更新效果&#xff0c;不需要用户单独重新安装软件即可实现页面的版本更新。 2.webview通知uniapp 在开发过程中我们难会遇到需要uniapp和webview来实现数据通信的场景&#xff0c;接下来…...

【Linux】Hadoop-3.4.1的伪分布式集群的初步配置

配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点&#xff08;即使在伪分布式模式下&#xff09; sudo apt install openssh-server …...

【Java】深入了解下Java Bitset

【Java】深入了解下Java Bitset 推荐超级课程&#xff1a; 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录 【Java】深入了解下Java Bitset引言如果Java Bitset不是布尔数组&#xff0c;那它是什么…...

Linux CentOS7 安装 ffmpeg教程

官网&#xff1a;FFmpeg 操作 先用uname -a 查看内核版本&#xff0c;如果是 3.2.0或者以上就可以按照此办法来安装 cd /tmp wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz# 2. 解压 tar xvf ffmpeg-release-amd64-static.tar.xz# 3. 将…...

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中&#xff0c;为了实现高效、智能的管理&#xff0c;楼宇自控系统变得越来越重要。它就像建筑的 智能管家&#xff0c;可自动控制照明、空调、通风等各种机电设备&#xff0c;让建筑运行更顺畅&#xff0c;还能节省能源成本。而在楼宇自控系统里&#xff0c;有两种关…...

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时&#xff0c;看到其封装了ALOHA ACT、diffusion policy、π0时&#xff0c;我就在想&#xff0c;lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事&#xff0c;对他们也是很好的历练然当25年3.18日…...

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型&#xff1f; 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中&#xff0c;高效地规划和跟踪项目进度是至关重要的。甘特图&#xff0c;作为项目管理领域的经典工具&#xff0c;以其直观的时间轴和任务分配方式&#xff0c;深受项目管理者的青睐。 随着数字化时代的到来&#xff0c;甘特图线上编辑器应运而生&…...

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…...

2 相交链表

1 常规思路 比较两个链表的长度&#xff0c;然后让较短的链表走二者长度之差&#xff0c;此时两个链表就一样长了&#xff0c;开始用双指针遍历&#xff0c;如果有相等返回&#xff0c;没有返回null&#xff1b; 为了减少冗余代码&#xff0c;我们设置一个minCur和maxCur分别…...

2025-03-22 学习记录--C/C++-C 库函数 - getchar()

C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> &#xff08;一&#xff09;、函数声明 &#x1f36d; int getchar(void)从标准输入 stdin 获取一个字符&#xff08;一个无符号字符&#xff09;。 参数&#xff1a;&#x1f380; NA 返回值&#xff1a;&#x1f38…...

APM 仿真遥控指南

地面站开发了一段时间了&#xff0c;由于没有硬件&#xff0c;所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析&#xff0c;显示无人机状态&#xff0c;给无人机发送消息&#xff0c;实现一键起飞&#xff0c;飞往指定地点&#xff0c;降落&#xff0c;返…...

如何防止大语言模型生成有害内容?技术与非技术手段解析

目录 如何防止大语言模型生成有害内容&#xff1f;技术与非技术手段解析 1. 技术手段 方法 1&#xff1a;使用内容过滤&#xff08;Content Filtering&#xff09; 方法 2&#xff1a;基于模型的有害内容检测&#xff08;Toxicity Classification&#xff09; 方法 3&#…...

BBR 和 CUBIC 对长肥管道的不同反应

有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣&#xff0c;它们的表现竟然截然相反&#xff1a; CUBIC 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越低&#xff1b;BBR 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越高。 前一个被看…...

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…...

Spring框架入门指南:从Hello World到IOC容器

第一章&#xff1a;Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…...

嵌入式电路设计软件个人安装步骤分享

各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…...

git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]

目录 一些常见命令&#xff1a; git 回退版本 一、临时回退&#xff08;不会修改历史&#xff0c;可随时回到当前版本&#xff09; 方法1&#xff1a;git checkout HEAD~1 二、永久回退&#xff08;改变分支指向&#xff09; 方法2&#xff1a;git reset 1. 保留修改&am…...

学习笔记:黑马程序员JavaWeb开发教程(2025.3.22)

11.1 案例-员工管理-新增员工 考试完之后&#xff0c;时隔一个月再次运行项目&#xff0c;出现了报错&#xff1a; class lombok.javac.apt.LombokProcessor (in unnamed module 0x5d7f1e59) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironme…...

Java IO性能优化:字节流与缓冲流的对比与实战分析

引言 在Java开发中&#xff0c;文件读写和网络数据传输是高频操作。然而&#xff0c;许多开发者在使用FileInputStream、FileOutputStream等基础字节流时&#xff0c;常因忽略IO性能问题导致程序效率低下。本文将深入分析普通字节流与**缓冲字节流&#xff08;BufferedInputSt…...

【Java SE】单例设计模式

参考笔记&#xff1a;深入理解Java设计模式&#xff1a;单例模式及其饿汉式与懒汉式的对比,-CSDN博客 目录 1.什么是设计模式 2.经典设计模式 3.单例设计模式&#xff08;static属性/方法经典使用场景 &#xff09; 3.1 饿汉式单例模式 3.2 懒汉式单例模式 4.补充 1.什么…...

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…...