0

I encountered a problem with downloading grid fs stored image via spring controller. When trying to open the downloaded file the image viewer says that it is corrupted, it turns out that the image is in base64 format.

There is the controller part:

@Override
@RequestMapping(value = "/image_download", method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadImage(...) throws IOException {

    final GridFSDBFile image = getImageFromGrifFs(...);

    final HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.valueOf(image.getContentType()));
    headers.setContentDispositionFormData("attachment", image.getFileName());

    final byte[] content = IOUtils.toByteArray(image.getInputStream());

    return new ResponseEntity<>(content, headers, HttpStatus.OK);

}

Spring version is 4.3.11. And here are the message converters:

@Override
public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter());
    converters.add(byteArrayHttpMessageConverter());
    super.configureMessageConverters(converters);
}

@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
    final ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
    arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
    return arrayHttpMessageConverter;
}

private List<MediaType> getSupportedMediaTypes() {
    final List<MediaType> list = new ArrayList<>();
    list.add(MediaType.IMAGE_JPEG);
    list.add(MediaType.IMAGE_PNG);
    list.add(MediaType.IMAGE_GIF);
    list.add(MediaType.APPLICATION_OCTET_STREAM);
    return list;
}

I also tried using InputStreamResource the following way in the controller:

return ResponseEntity.ok()
        .contentLength(image.getLength())
        .contentType(MediaType.parseMediaType(image.getContentType()))
        .body(new InputStreamResource(image.getInputStream()));

But got the exception:

Could not write content: No serializer found for class com.mongodb.gridfs.GridFSDBFile$MyInputStream

Any help appreciated. Thank you.

Artyom Rebrov
  • 651
  • 6
  • 23

1 Answers1

0

After I'd done some more digging I found good explanation: https://stackoverflow.com/a/44943494/2421204

And indeed adding (produces = "image/jpeg") to RequestMapping solved the issue.

 @RequestMapping(value = "/image_download", method = RequestMethod.GET, produces = "image/jpeg")

The images that are downloaded are in binary.

Artyom Rebrov
  • 651
  • 6
  • 23