diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java index 2f767e149..0dcb340bd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsOperations.java @@ -34,6 +34,7 @@ import com.mongodb.client.gridfs.GridFSFindIterable; * @author Thomas Darimont * @author Martin Baumgartner * @author Christoph Strobl + * @author Hartmut Lang */ public interface GridFsOperations extends ResourcePatternResolver { @@ -157,6 +158,13 @@ public interface GridFsOperations extends ResourcePatternResolver { */ GridFsResource getResource(String filename); + /** + * Returns the {@link GridFsResource} for a {@link com.mongodb.client.gridfs.model.GridFSFile}. + * @param file must not be {@literal null}. + * @return the resource for the file. + */ + GridFsResource getResource(com.mongodb.client.gridfs.model.GridFSFile file); + /** * Returns all {@link GridFsResource}s matching the given file name pattern. * diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java index faf1f48b3..b4bfc2f35 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/gridfs/GridFsTemplate.java @@ -51,6 +51,7 @@ import com.mongodb.client.gridfs.model.GridFSUploadOptions; * @author Martin Baumgartner * @author Christoph Strobl * @author Mark Paluch + * @author Hartmut Lang */ public class GridFsTemplate implements GridFsOperations, ResourcePatternResolver { @@ -228,13 +229,22 @@ public class GridFsTemplate implements GridFsOperations, ResourcePatternResolver public GridFsResource getResource(String location) { GridFSFile file = findOne(query(whereFilename().is(location))); - return file != null ? new GridFsResource(file, getGridFs().openDownloadStream(location)) : null; + return file != null ? getResource(file) : null; } /* * (non-Javadoc) - * @see org.springframework.core.io.support.ResourcePatternResolver#getResources(java.lang.String) + * @see org.springframework.data.mongodb.gridfs.GridFsOperations#getResource(com.mongodb.client.gridfs.model.GridFSFile) */ + public GridFsResource getResource(GridFSFile file) { + + return new GridFsResource(file, getGridFs().openDownloadStream(file.getFilename())); + } + + /* + * (non-Javadoc) + * @see org.springframework.core.io.support.ResourcePatternResolver#getResources(java.lang.String) + */ public GridFsResource[] getResources(String locationPattern) { if (!StringUtils.hasText(locationPattern)) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateIntegrationTests.java index f499e636c..d66ec7ac5 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/gridfs/GridFsTemplateIntegrationTests.java @@ -42,6 +42,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.mongodb.MongoGridFSException; import com.mongodb.client.gridfs.GridFSFindIterable; +import com.mongodb.client.gridfs.model.GridFSFile; /** * Integration tests for {@link GridFsTemplate}. @@ -50,6 +51,7 @@ import com.mongodb.client.gridfs.GridFSFindIterable; * @author Philipp Schneider * @author Thomas Darimont * @author Martin Baumgartner + * @author Hartmut Lang */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:gridfs/gridfs.xml") @@ -225,6 +227,20 @@ public class GridFsTemplateIntegrationTests { assertThatThrownBy(() -> result.getContentType()).isInstanceOf(MongoGridFSException.class); } + @Test // DATAMONGO-1813 + public void convertFileToResource() throws IOException { + + Document metadata = new Document("key", "value"); + ObjectId reference = operations.store(resource.getInputStream(), "foobar", metadata); + + List files = new ArrayList(); + GridFSFile file = operations.findOne(query(whereMetaData("key").is("value"))); + GridFsResource result = operations.getResource(file); + + assertThat(result.contentLength()).isEqualTo(resource.contentLength()); + assertThat(((BsonObjectId) result.getId()).getValue()).isEqualTo(reference); + } + class Metadata { String version; }