Я не могу понять, как передавать двоичный файл из 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?