0
스프링 컨트롤러를 통해 그리드 파일 저장 이미지를 다운로드하는 데 문제가 발생했습니다. 이미지 뷰어에서 다운로드 한 파일을 열려고하면 파일이 손상되었다는 메시지가 표시됩니다. 이미지는 base64 형식입니다.스프링 컨트롤러 이미지 다운로드 (바이트 단위) 대신 base64
@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);
}
봄 버전은 4.3.11입니다 :
컨트롤러 부분이있다.
@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;
}
가 나는 또한 컨트롤러에서 다음과 같은 방법으로하는 InputStreamResource 사용하여 시도 : 그리고 여기에 메시지 컨버터입니다
return ResponseEntity.ok()
.contentLength(image.getLength())
.contentType(MediaType.parseMediaType(image.getContentType()))
.body(new InputStreamResource(image.getInputStream()));
그러나 예외를 가지고 :
콘텐츠를 쓸 수 없습니다 : com.mongodb.gridfs.GridFSDBFile $ MyInputStream에 대한 serializer가 없습니다.
도움을 주시면 감사하겠습니다. 고맙습니다.