2017-10-31 17 views
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가 없습니다.

도움을 주시면 감사하겠습니다. 고맙습니다.

답변

0

내가 수행했던 한 후 좀 더 내가 좋은 설명을 발견 파고 : https://stackoverflow.com/a/44943494/2421204

그리고 실제로 추가 (= "이미지/JPEG를"생산) RequestMapping 문제를 해결하는 방법에 대해.

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

다운로드되는 이미지는 바이너리 형식입니다.