当我已经有了正确的ObjectId时,我不知道如何用spring数据mongodb及其GridFSTemplate从GridFS流式传输二进制文件.

GridFSTemplate返回GridFSResource(getResource())或GridFSFile(findX()).

我可以通过ID获得GridFSFile:

// no way to get the InputStream?
GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)))

但是没有明显的方法可以让GridFSFile得到InputStream分.

只有GridFSResource能让我用InputStreamResource#getInputstream找到对应的InputStream.但获得GridFSResource分的唯一途径是filename分.

// no way to get GridFSResource by ID?
GridFSResource resource = gridFsTemplate.getResource("test.jpeg");
return resource.getInputStream();

不知何故,GridFsTemplate API意味着文件名是唯一的——事实并非如此.GridFsTemplate实现只返回第一个元素.

现在,我正在使用原生MongoDB API,一切都再次变得有意义:

GridFS gridFs = new GridFs(mongo);
GridFSDBFile nativeFile = gridFs.find(blobId);
return nativeFile.getInputStream();

看起来我误解了Spring数据Mongo GridFS抽象背后的基本概念.我希望(至少)以下事情之一是可能的/真实的:

  • 按ID取GridFSResource
  • GridFSResourceInputStreamGridFsFile我已经有了

是我错了,还是Spring数据MongoDB API的这一部分有什么奇怪的地方?

推荐答案

我也偶然发现了这一点.我对GridFsTemplate的设计非常震惊...

public GridFsResource download(String fileId) {
    GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));

    return new GridFsResource(file, getGridFs().openDownloadStream(file.getObjectId()));
}

private GridFSBucket getGridFs() {

    MongoDatabase db = mongoDbFactory.getDb();
    return GridFSBuckets.create(db);
}

注意:您必须注入MongoDbFactory才能使其工作...

Mongodb相关问答推荐

如何从MongoDB集合中获取第一个和最后一个元素?

MongoDB更新对象数组

Next js、MongoDB和Prisma.包括不为相关字段工作

没有mongoose 的 Express 和 MongoDB

MongoDB C# 驱动程序 - 如何将 _id 存储为 ObjectId 但映射到字符串 Id 属性?

如何在 $lookup Mongodb 的 LocalField 中将字符串转换为 objectId

将数据插入 MongoDB - 没有错误,没有插入

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

是否有适用于 Linux 的 MongoDB GUI 桌面应用程序?

如何在 mongoDB 中聚合巨大的数组?

Node + Mongoose:获取最后插入的 ID?

在 mongodb 中的索引列上查找重复项的快速方法

如何为 node.js 中的 MongoDB 索引指定 javascript 对象中的属性顺序?

如何在 Meteor 应用程序之间共享 MongoDB 集合?

Mongo聚合框架,排序然后分组不起作用

无法使用命令写入模式错误,降级到兼容模式

单个语句中的多个 mongo 更新运算符?

如何在mongoDB中检索其值以特定字符结尾的文档

spring 数据MongoDB.生成id的错误

Mongodb Compass 无法在 Ubuntu 18.10 中打开