복붙노트

[SPRING] spring mvc rest controller에서 base64로 인코딩 된 바이트 [] 대신 이진 데이터를 반환하는 방법

SPRING

spring mvc rest controller에서 base64로 인코딩 된 바이트 [] 대신 이진 데이터를 반환하는 방법

나는 spring-mvc-rest 컨트롤러를 통해 생성 된 pdf 파일을 반환하고 싶다. 이것은 현재 사용중인 코드의 단축 버전입니다.

@RestController
@RequestMapping("/x")
public class XController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ResponseEntity<byte[]> find() throws IOException {
        byte[] pdf = createPdf();

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "pdf"));
        headers.setContentDispositionFormData("attachment", "x.pdf");
        headers.setContentLength(pdf.length);
        return new ResponseEntity<byte[]>(pdf, headers, HttpStatus.OK);
    }
}

이것은 거의 정상적으로 작동합니다. 단지 실제 바이트 배열을 base64로 인코딩 된 것으로 반환합니다.

curl -i 'http://127.0.0.1:8080/app/x'

Server: Apache-Coyote/1.1
Content-Disposition: form-data; name="attachment"; filename=x.pdf"
Content-Type: application/pdf
Content-Length: 138654
Date: Fri, 08 Jan 2016 11:25:38 GMT

"JVBERi0xLjYNJeLjz9MNCjMyNCAwIG9iag [...]

(btw. 응답에도 닫는 것을 포함하지 않습니다 ":)

어떤 힌트를 주셔서 감사합니다!

해결법

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

    1.귀하의 코드를 사용하여 예제를 만들었지 만, 매우 유사한 방법으로 내 웹 응용 프로그램에서 자신의 작업을 수행하고 있습니다.

    귀하의 코드를 사용하여 예제를 만들었지 만, 매우 유사한 방법으로 내 웹 응용 프로그램에서 자신의 작업을 수행하고 있습니다.

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public void downloadFile(HttpServletResponse response,
                             HttpServletRequest request) throws IOException
    {
        byte[] pdf = createPdf();
    
        response.setContentType("application/x-download");
        response.setHeader("Content-Disposition", "attachment; filename=foo.pdf");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.getOutputStream().write(pdf);
    }
    

    그렇지 않으면이 대답을 시도해보십시오. 새 브라우저 탭에서 ResponseEntity PDF를 엽니 다.

  2. ==============================

    2.문제는 Spring이 응답을 Json으로 인코딩하려고 시도 할 때 발생합니다.

    문제는 Spring이 응답을 Json으로 인코딩하려고 시도 할 때 발생합니다.

    귀하의 요청은 아마도 Accepts = "* / *"를 지정하고 Spring은 ResponseEntity의 ContentType을 무시하기 때문에 가장 좋은 인코딩은 application / json입니다.

    가장 간단한 해결 방법은 요청 매핑에 produce를 추가하여 코드가 다음과 같이되는 것입니다.

    @RestController
    @RequestMapping(value = "/x",
                    produces = "application/pdf") // <-- Add this
    public class XController {
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public ResponseEntity<byte[]> find() throws IOException {
            byte[] pdf = createPdf();
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(new MediaType("application", "pdf"));
            headers.setContentDispositionFormData("attachment", "x.pdf");
            headers.setContentLength(pdf.length);
            return new ResponseEntity<byte[]>(pdf, headers, HttpStatus.OK);
        }
    }
    
  3. ==============================

    3.이것은 내 코드이며 잘 작동합니다. 아마도 이것이 도움이 될 것입니다.

    이것은 내 코드이며 잘 작동합니다. 아마도 이것이 도움이 될 것입니다.

    @RequestMapping(value = "/createReport", method = RequestMethod.POST,produces="application/pdf")
        @ResponseStatus(value = HttpStatus.OK)
        public ResponseEntity<byte[]> createReport(@RequestBody ReporteDTO reporteDTO) {
            byte[] outputReport = null;
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType("application/pdf"));
            headers.setContentDispositionFormData("inline", "archivo.pdf");
            headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
                 outputReport = getFilePdf();
            ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(outputReport, headers, HttpStatus.OK);
            return response;
        } 
    
  4. ==============================

    4.생성 속성을 RequestMapping에 추가합니다.

    생성 속성을 RequestMapping에 추가합니다.

    @RequestMapping(path = "/download", produces = "application/pdf")
    
  5. from https://stackoverflow.com/questions/34676037/how-to-return-binary-data-instead-of-base64-encoded-byte-in-spring-mvc-rest-co by cc-by-sa and MIT license