重写GridFsTemplate类, MongoDB文件库实现同名文件共存 顶

在MongoDB库中使用GridFsTemplate给基于Spring Boot的项目在进行文件的存储和读取操作提供了很大的便利,但是在使用过程中要获取MongDB库内文件的InputStream时,却仅有如下方法获取:

public GridFsResource getResource(String location) {
    GridFSFile file = findOne(query(whereFilename().is(location)));
    return file != null ? new GridFsResource(file, getGridFs().openDownloadStream(location)) : null;
}

这种方法的好处是在库内不存在多个同名文件时可以通过简单的文件名获取到文件的InputStream进行下载操作,但是在一个共享库规模大,出现多个同名不同内容的文件时,以上方法就存在局限性了,因此通过重写GridFsTemplate类的以上方法,可以简单的实现单库内多个同名文件的区别存储和读取操作,简要示例代码如下:

@Component
public class GridFsAssistant {

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

    private final MongoClient mongoClient;

    @Autowired
    public GridFsAssistant(MongoClient mongoClient) {
        this.mongoClient = mongoClient;
    }

    public MongoDatabase getMongoDB(String databaseName) {
        return mongoClient.getDatabase(databaseName);
    }

    public MongoDatabase getDefaultMongoDB() {
        return getMongoDB(database);
    }

    public GridFSDownloadStream getResource(ObjectId storedId) {
        GridFSBucket gridFSBucket = GridFSBuckets.create(getDefaultMongoDB());
        MongoCollection<Document> coll = getDefaultMongoDB().getCollection("fs.files");
        FindIterable<Document> file = coll.find(eq("_id", storedId));
        return file.first() != null ? gridFSBucket.openDownloadStream(storedId) : null;
    }
}

以上是在使用GridFS进行MongDB文件存储及下载实现过程中发现的一个小问题,详细项目代码参见以下文档共享服务项目V0.1版本:

码云地址:https://gitee.com/mxleader/quick-doc-service

GitHub:     https://github.com/cbcgorilla/quick-doc-service

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zhisheng

渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)

上篇文章写完了 ES 流程启动的一部分,main 方法都入口,以及创建 Elasticsearch 运行的必须环境以及相关配置,接着就是创建该环境的节点了。

17830
来自专栏柠檬先生

RHS 和 LHS

8730
来自专栏hbbliyong

DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

一、错误情况 环境:win7+iis7.0 DirectoryEntry配置IIS7出现如下错误 ? 或者是 下面一段代码在IIS6.0下运转正常,但IIS7....

43970
来自专栏java一日一条

聊聊并发-Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内...

13300
来自专栏容器云生态

Docker-client for python使用指南

Docker-client for python使用指南: 客户端初始化的三种方法 import docker docker.api() docker.APIC...

1.4K100
来自专栏PHP在线

深入理解PHP原理之异常机制

PHP的异常机制的原理是什么? 在PHP每一个可独立执行的op array最后的ZEND_HANDLE_EXCEPTION是用来干什么呢? 让我们从一个问题说起...

410110
来自专栏Kubernetes

Kubernetes Node Controller源码分析之Taint Controller

Author: xidianwangtao@gmail.com NewNoExecuteTaintManager 在Kubernetes Node Con...

480130
来自专栏黑白安全

WAF绕过的一些总结和思考

WAF分类: 1.网络层类 2.最常见且容易部署的应用层类 (部署在APAC++HE之前,APAC++HE之后) 应用层WAF – 利用WAF自身缺陷和M...

13920
来自专栏三丰SanFeng

无锁编程(二) - 原子操作

什么是原子操作 原子操作可以保证指令以原子的方式执行——执行过程不被打断,原子操作是多数无锁编程的基本前提。 原子操作分为以下几类 对1字节的读写 对2字节数(...

58250
来自专栏猿学

猿学-内核开发知识3之串口过滤.绑定设备

根据上面的理论.我们可以根据API. 写简单的串口绑定了. 注意下方代码是串口绑定的代码.相当于我们在这个设备上加了一层.但是我们还没有写获取请求数据的代码.

7100

扫码关注云+社区

领取腾讯云代金券