복붙노트

[SPRING] Spring에서 웹 서비스로부터 이미지를 보내는 방법

SPRING

Spring에서 웹 서비스로부터 이미지를 보내는 방법

스프링 웹 서비스를 사용하여 이미지를 보내는 동안 문제가 발생했습니다.

나는 컨트롤러를 다음과 같이 작성했다.

@Controller
public class WebService {

    @RequestMapping(value = "/image", headers = "Accept=image/jpeg, image/jpg, image/png, image/gif", method = RequestMethod.GET)
    public @ResponseBody byte[] getImage() {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream("myimage.jpg");
            BufferedImage bufferedImage = ImageIO.read(inputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write( bufferedImage  , "jpg", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

@ResponseBody는 응답을 JSON으로 변환합니다.

RestClient를 사용하여 웹 서비스를 테스트하고 있습니다.

하지만 http : // localhost : 8080 / my-war-name / rest / image URL로 치면됩니다.

Header 
Accept=image/jpg

RestClient에서 다음 오류가 발생했습니다.

Chrome과 Firefox 브라우저를 사용할 때

헤더가 추가되지 않아 오류가 예상됩니다 (이 부분을 안내하십시오)

HTTP Status 405 - Request method 'GET' not supported

type Status report

message Request method 'GET' not supported

description The specified HTTP method is not allowed for the requested resource (Request method 'GET' not supported).

나는 또한 한 번 오류 아래에 직면했다.

나는 따라 갔다. http://krams915.blogspot.com/2011/02/spring-3-rest-web-service-provider-and.html 자습서.

내 요구 사항은 안드로이드 클라이언트에 바이트 형식으로 이미지를 보내는 것입니다.

해결법

  1. ==============================

    1.soulcheck이 제공 한 답변 외에도. Spring은 @RequestMapping 주석에 프로퍼티를 추가했다. 따라서 솔루션은 이제 더 쉬워졌습니다.

    soulcheck이 제공 한 답변 외에도. Spring은 @RequestMapping 주석에 프로퍼티를 추가했다. 따라서 솔루션은 이제 더 쉬워졌습니다.

    @RequestMapping(value = "/image", method = RequestMethod.GET, produces = "image/jpg")
    public @ResponseBody byte[] getFile()  {
        try {
            // Retrieve image from the classpath.
            InputStream is = this.getClass().getResourceAsStream("/test.jpg"); 
    
            // Prepare buffered image.
            BufferedImage img = ImageIO.read(is);
    
            // Create a byte array output stream.
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
    
            // Write to output stream
            ImageIO.write(img, "jpg", bao);
    
            return bao.toByteArray();
        } catch (IOException e) {
            logger.error(e);
            throw new RuntimeException(e);
        }
    }
    
  2. ==============================

    2.#soulcheck의 대답은 부분적으로 옳습니다. mvc-annotation 요소와 충돌하기 때문에 Spring의 최신 버전에서는 설정이 작동하지 않습니다. 아래의 구성을 시도하십시오.

    #soulcheck의 대답은 부분적으로 옳습니다. mvc-annotation 요소와 충돌하기 때문에 Spring의 최신 버전에서는 설정이 작동하지 않습니다. 아래의 구성을 시도하십시오.

    <mvc:annotation-driven>
      <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
      </mvc:message-converters>
    </mvc:annotation-driven>
    

    위의 설정이 설정 파일에 있으면됩니다. 아래 코드가 작동합니다.

    @RequestMapping(value = "/image", headers = "Accept=image/jpeg, image/jpg, image/png, image/gif", method = RequestMethod.GET)
    public @ResponseBody BufferedImage getImage() {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream("myimage.jpg");
            return ImageIO.read(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    
  3. ==============================

    3.우수한 baeldung.com 웹 사이트의이 기사를 참조하십시오.

    우수한 baeldung.com 웹 사이트의이 기사를 참조하십시오.

    Spring Controller에서 다음 코드를 사용할 수 있습니다 :

    @RequestMapping(value = "/rest/getImgAsBytes/{id}", method = RequestMethod.GET)
    public ResponseEntity<byte[]> getImgAsBytes(@PathVariable("id") final Long id, final HttpServletResponse response) {
        HttpHeaders headers = new HttpHeaders();
        headers.setCacheControl(CacheControl.noCache().getHeaderValue());
        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
    
        try (InputStream in = imageService.getImageById(id);) { // Spring service call
            if (in != null) {
                byte[] media = IOUtils.toByteArray(in);
                ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(media, headers, HttpStatus.OK);
                return responseEntity;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<>(null, headers, HttpStatus.NOT_FOUND);
    }
    

    참고 : IOUtils는 common-io apache 라이브러리에서 제공됩니다. 나는 스프링 서비스를 사용하여 데이터베이스에서 img / pdf Blob을 검색하고있다.

    콘텐츠 형식에서 MediaType.APPLICATION_PDF_VALUE를 사용해야한다는 점을 제외하면 pdf 파일과 비슷한 처리 방법입니다. 그리고 HTML 페이지에서 이미지 파일이나 pdf 파일을 참조 할 수 있습니다.

    <html>
      <head>
      </head>
      <body>
        <img src="https://localhost/rest/getImgDetectionAsBytes/img-id.jpg" />
        <br/>
        <a href="https://localhost/rest/getPdfBatchAsBytes/pdf-id.pdf">Download pdf</a>
      </body>
    </html>
    

    ... 또는 브라우저에서 직접 웹 서비스 메서드를 호출 할 수 있습니다.

  4. ==============================

    4.변환을 json으로 변환하고 바이트 배열을있는 그대로 보냈습니다.

    변환을 json으로 변환하고 바이트 배열을있는 그대로 보냈습니다.

    유일한 단점은 기본적으로 application / octet-stream 콘텐츠 유형을 전송한다는 것입니다.

    그게 아니라면 등록 된 이미지 리더가 지원하는 이미지 유형을 보낼 수있는 BufferedImageHttpMessageConverter를 사용할 수 있습니다.

    그런 다음 메소드를 다음과 같이 변경할 수 있습니다.

    @RequestMapping(value = "/image", headers = "Accept=image/jpeg, image/jpg, image/png, image/gif", method = RequestMethod.GET)
    public @ResponseBody BufferedImage getImage() {
        try {
            InputStream inputStream = this.getClass().getResourceAsStream("myimage.jpg");
            return ImageIO.read(inputStream);
    
    
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    

    가지고있는 동안 :

     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="order" value="1"/>
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
            </list>
        </property>
    </bean>
    

    당신의 봄 설정에서.

  5. ==============================

    5.여기에 제가 작성한 방법이 있습니다.

    여기에 제가 작성한 방법이 있습니다.

    페이지에 인라인 이미지를 표시하고 선택적으로이를 클라이언트에 다운로드해야하므로 선택적 매개 변수를 사용하여 해당 헤더를 설정해야합니다.

    문서는 문서를 나타내는 내 개체 모델입니다. 나는 그 파일 자체를 그 문서를 저장하는 레코드의 ID 이름을 따라 디스크에 저장했다. 원래 파일 이름과 MIME 유형은 Document 객체에 저장됩니다.

    @RequestMapping("/document/{docId}")
    public void downloadFile(@PathVariable Integer docId, @RequestParam(value="inline", required=false) Boolean inline, HttpServletResponse resp) throws IOException {
    
        Document doc = Document.findDocument(docId);
    
        File outputFile = new File(Constants.UPLOAD_DIR + "/" + docId);
    
        resp.reset();
        if (inline == null) {
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + doc.getFilename() + "\"");
        }
        resp.setContentType(doc.getContentType());
        resp.setContentLength((int)outputFile.length());
    
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(outputFile));
    
        FileCopyUtils.copy(in, resp.getOutputStream());
        resp.flushBuffer();
    
    }
    
  6. from https://stackoverflow.com/questions/8656085/how-to-send-an-image-from-web-service-in-spring by cc-by-sa and MIT license