[SPRING] spring mvc rest controller에서 base64로 인코딩 된 바이트 [] 대신 이진 데이터를 반환하는 방법
SPRINGspring 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.귀하의 코드를 사용하여 예제를 만들었지 만, 매우 유사한 방법으로 내 웹 응용 프로그램에서 자신의 작업을 수행하고 있습니다.
귀하의 코드를 사용하여 예제를 만들었지 만, 매우 유사한 방법으로 내 웹 응용 프로그램에서 자신의 작업을 수행하고 있습니다.
@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.문제는 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.이것은 내 코드이며 잘 작동합니다. 아마도 이것이 도움이 될 것입니다.
이것은 내 코드이며 잘 작동합니다. 아마도 이것이 도움이 될 것입니다.
@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.생성 속성을 RequestMapping에 추가합니다.
생성 속성을 RequestMapping에 추가합니다.
@RequestMapping(path = "/download", produces = "application/pdf")
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
'SPRING' 카테고리의 다른 글
[SPRING] 폼 로그인없이 스프링 보안 (0) | 2019.03.17 |
---|---|
[SPRING] Mockito.when 같은 물건에 여러 번 전화를? (0) | 2019.03.17 |
[SPRING] Spring 4.0에서의 문자열 변환 (0) | 2019.03.17 |
[SPRING] 스프링 캐스팅 자동 캐스팅 (0) | 2019.03.17 |
[SPRING] Spring 보안의 모든 요청에서 데이터베이스의 UserDetails 객체 다시로드 (0) | 2019.03.17 |