当我已经正确获取了ObjectId
时,我无法弄清如何使用spring-data-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 Data Mongo的GridFS抽象概念。我期望至少可以实现以下事情之一:
- 通过其ID获取
GridFSResource
- 为我已有的
GridFsFile
获取GridFSResource
或InputStream
我是错了还是这个Spring Data MongoDB API的这一特定部分有些奇怪?