设为首页 加入收藏

TOP

Springboot集成MongoDB存储文件、读取文件(一)
2023-07-25 21:31:44 】 浏览:59
Tags:Springboot 集成 MongoDB 储文件 文件

一、前言和开发环境及配置

可以转载,但请注明出处。  

之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅。

https://www.cnblogs.com/zaoyu/p/springboot-mongodb.html

 

使用mongodb存储文件并实现读取,通过springboot集成mongodb操作。 

可以有两种实现方式:

1. 单个文件小于16MB的,可以直接把文件转成二进制或者使用如Base64编码对文件做编码转换,以二进制或者string格式存入mongodb。

读取时,把二进制数据或者string数据转成对应的IO流或做解码,再返回即可。 

2. 对于单个文件大于16MB的,可以使用mongodb自带的GridFS

 

 开发环境、工具:JDK1.8,IDEA 2021

Springboot版本:2.7.5

Mongodb依赖版本:4.6.1

SpringBoot的配置 application.properties 如下

# 应用名称
spring.application.name=demo
#server.port=10086 不配置的话,默认8080

# springboot下mongoDB的配置参数。
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
# 指定数据库库名
spring.data.mongodb.database=temp

 

二、实现步骤和代码

1. 小文件存储

1.1 说明和限制

 由于MongoDB限制单个文档大小不能超过16MB,所以这种方式仅适用于单个文件小于16MB的。

如果传入大于16MB的文件,存储是会失败的,报错如下。

 

1.2 实现代码

package com.onepiece.mongo;

import org.bson.Document;
import org.bson.types.Binary;
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.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.io.*;
import java.util.Base64;
import java.util.List;

/**
 * @author zaoyu
 * @description  用于演示Mongodb的文件存储(单个文件不大于16MB)
 */

@SpringBootTest
public class MongoSaveFiles {

    @Autowired
    private MongoTemplate mongoTemplate;

    // collection名
    private String IMAGE_COLLECTION = "image";
    // 源文件完整路径
    private String FILE_PATH = "D:\\temp\\onepiece.jpg";
    // 输出文件路径
    private String FILE_OUTPUT_PATH = "C:\\Users\\onepiece\\Desktop\\";
    // 限制16MB
    private Long FILE_SIZE_LIMIT = 16L * 1024L * 1024L;

    @Test
    public void saveFiles(){
        byte[] fileContent = null;
        FileInputStream fis = null;
        try {
            File file = new File(FILE_PATH);
            long length = file.length();
            // 校验文件大小,大于16MB返回。 这里的操作逻辑依据你自己业务需求调整即可。
            if (length >= FILE_SIZE_LIMIT) {
                System.out.println("文件: " + file.getAbsolutePath() + "  超出单个文件16MB的限制。" );
                return;
            }
            fileContent = new byte[(int) file.length()];
            fis = new FileInputStream(file);
            // 读取整个文件
            fis.read(fileContent);
            // 把文件内容以二进制格式写入到mongodb
            Document document = new Document();
            // fileName字段、content字段自定义。 
            document.append("fileName", file.getName());
            document.append("content", new Binary(fileContent));
            Document insert = mongoTemplate.insert(document, IMAGE_COLLECTION);
            System.out.println("文件 " + file.getName() + " 已存入mongodb,对应ID是: " + insert.get("_id").toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 测试读取并写入到指定路径。
     */
    @Test
    public void readAndWriteFiles(){
        // 这里也是,默认查所有,需要条件自行增加。 简单取1条验证。 
        List<Document> result = mongoTemplate.find(new Query(), Document.class, IMAGE_COLLECTION);
        Document document = result.get(0);
        // 取出存储的二进制数据,这里用binary.class处理。
        Binary content = document.get("content", Binary.class);
        String fileName = document.get("fileName", String.class)
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Boot 中使用 Redis 下一篇Java Stream常见用法汇总,开发效..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目