Я не могу понять, как передавать двоичный файл из GridFS с помощью spring-data-mongodb и его GridFSTemplate
когда у меня уже есть правильный ObjectId
.
GridFSTemplate возвращает либо GridFSResource
(getResource()
), либо GridFSFile
(findX()
).
Я могу получить GridFSFile
по ID:
// no way to get the InputStream?
GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)))
но нет очевидного способа, как получить InputStream
для этого GridFSFile
.
Только GridFSResource
позволяет мне получить соответствующий InputStream
с InputStreamResource#getInputstream
. Но единственный способ получить GridFSResource
- по filename
.
// no way to get GridFSResource by ID?
GridFSResource resource = gridFsTemplate.getResource("test.jpeg");
return resource.getInputStream();
Каким-то GridFsTemplate
API GridFsTemplate
подразумевает, что имена файлов уникальны - а это не так. Реализация GridFsTemplate
просто возвращает первый элемент.
Теперь я использую нативный API MongoDB, и все снова имеет смысл:
GridFS gridFs = new GridFs(mongo);
GridFSDBFile nativeFile = gridFs.find(blobId);
return nativeFile.getInputStream();
Похоже, я неправильно понимаю фундаментальные концепции, лежащие в основе абстракции Spring Data Mongo GridFS. Я ожидаю (по крайней мере) одну из следующих вещей, которые будут возможны/верны:
- получить
GridFSResource
по его идентификатору - получить
GridFSResource
илиInputStream
дляGridFsFile
меня уже есть
Я не прав или есть что-то странное в этом конкретном фрагменте Spring Data MongoDB API?