[SPRING] Spring - 파일로서 응답을 다운로드한다.
SPRINGSpring - 파일로서 응답을 다운로드한다.
저는 AngularJS와 Spring을 사용하여 어플리케이션을 작성하고 있습니다. 나는 서버에 요청을 보내고 컨트롤러에서 파일로 반환 된 응답을 다운로드하고 싶다. 컨트롤러에서 나는 csv 파일의 내용 (문자열), 즉 1, 2, 3, 4 (1 행, 4 열)을가집니다. 이 응답을 파일로 다운로드하는 가장 간단한 방법은 무엇입니까?
아래에서는 간단한 코드를 게시했습니다. 스프링 컨트롤러에서 :
@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public String getCsvFile() {
return getCsvContent();
}
자바 스크립트 (AngularJS)
return $http({method: 'GET', url: 'csv/'});
응답 스트림 (아래)에 헤더를 설정하려고했지만 클라이언트 측에서는 다운로드 할 파일이 아닌 항상이 내용을 문자열로 가져옵니다.
@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public void getCsvFile(HttpServletResponse response) {
response.setContentType("application/csv");
response.setHeader("Content-Disposition", "attachment; filename=file.csv");
response.setContentLength(getCsvContent().getBytes().length);
ServletOutputStream out = response.getOutputStream();
out.write(getCsvContent());
out.flush();
out.close();
}
누구든지 클라이언트 쪽에서 파일로 응답을 다운로드하려면 컨트롤러의 메서드를 올바르게 작성하는 방법을 알고 있습니까?
해결법
-
==============================
1.XHR 요청을 통해 파일을 다운로드 할 수 없습니다 (Angular가 요청하는 방식 임). 왜 threre가 아약스 요청을 사용하여 파일을 다운로드 할 수 없는지보십시오. $ window.open을 통해 URL로 이동하거나 여기에 표시된 iframe 트릭을 수행해야합니다. JSON 데이터로 POST를 통해 파일을 다운로드하는 JavaScript / jQuery
XHR 요청을 통해 파일을 다운로드 할 수 없습니다 (Angular가 요청하는 방식 임). 왜 threre가 아약스 요청을 사용하여 파일을 다운로드 할 수 없는지보십시오. $ window.open을 통해 URL로 이동하거나 여기에 표시된 iframe 트릭을 수행해야합니다. JSON 데이터로 POST를 통해 파일을 다운로드하는 JavaScript / jQuery
-
==============================
2.나는 이것을 서버에서 작동 시키려고 노력했다. 그럴 수 없었다. 대신 ...
나는 이것을 서버에서 작동 시키려고 노력했다. 그럴 수 없었다. 대신 ...
-
==============================
3.XHR 요청을 사용하여 파일을 다운로드 할 수 있습니다. angular $ http를 사용하여 파일을로드 한 다음 HTML5의 Blob 기능을 사용하여 브라우저에서 저장할 수 있습니다. FileSaver.js를 저장하는 데 도움이되는 라이브러리가 있습니다.
XHR 요청을 사용하여 파일을 다운로드 할 수 있습니다. angular $ http를 사용하여 파일을로드 한 다음 HTML5의 Blob 기능을 사용하여 브라우저에서 저장할 수 있습니다. FileSaver.js를 저장하는 데 도움이되는 라이브러리가 있습니다.
-
==============================
4.네가 필요로하는 경우에 대비해서, 여기에 도움이되는 몇 가지 링크가 있습니다.
네가 필요로하는 경우에 대비해서, 여기에 도움이되는 몇 가지 링크가 있습니다.
건배
-
==============================
5.그것은 나를 위해 일하고있다 :
그것은 나를 위해 일하고있다 :
-
==============================
6.// 자바 파트
// 자바 파트
@RequestMapping(value = "/report-excel", method = RequestMethod.GET) public ResponseEntity<byte[]> getReportExcel(@RequestParam("bookingStatusType") String bookingStatusType, @RequestParam("endDate") String endDate, @RequestParam("product") String product, @RequestParam("startDate") String startDate)throws IOException, ParseException { //Generate Excel from DTO using any logic after that do the following byte[] body = wb.getBytes(); HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("application", "xlsx")); header.set("Content-Disposition", "inline; filename=" + fileName); header.setCacheControl("must-revalidate, post-check=0, pre-check=0"); header.setContentLength(body.length); return new ResponseEntity<byte[]>(body, header, HttpStatus.OK); } //HTML PART <html> <head> <title>Test</title> <meta http-equiv="content-type" content="application/x-www-form-urlencoded; charset=UTF-8"> </head> <body> <form name="downloadXLS" method="get" action="http://localhost:8080/rest/report-excel" enctype="multipart/form-data"> <input type="text" name="bookingStatusType" value="SALES"></input> <input type="text" name="endDate" value="abcd"></input> <input type="text" name="product" value="FLIGHT"></input> <input type="text" name="startDate" value="abcd"></input> <input onclick="document.downloadXLS.submit()" value="Submit"></input> </form> </body> </html>
-
==============================
7.controller.js //이 함수는 컨트롤러에 있으며 다운로드 버튼이 눌려지면 trigered가됩니다. $ scope.downloadSampleFile = function () { // 백엔드에서 응답으로 반환 된 Blob을 수락하기 위해 문서에 숨겨진 샘플 링크를 만듭니다. var downloadLink = document.createElement ( "a"); document.body.appendChild (downloadLink); downloadLink.style = "display : none"; //이 서비스는 다음과 같이 쓰여집니다. 다운로드 파일 .downloadfile (data) .then (function (result) { var fName = result.filename; var file = 새로운 Blob ([result.data], {type : 'application / *'}); var fileURL = (window.URL || window.webkitURL) .createObjectURL (file); // Blob, window obj의 도움으로 생성 된 URL에 브라우저 특정 다운로드 팝업을 가지고 생성 된 클라이언트 측 객체. downloadLink.href = fileURL; downloadLink.download = fName; downloadLink.click (); }); }; services.js .factory ( 'downloadFile', [ "$ http", function ($ http) { 반환 { downloadfile : function () { return $ http.get (// 여기에 요청을 보낼 서버 끝점 , { responseType : 'arraybuffer', 매개 변수 : { // 필수 매개 변수 }, }). 다음 (함수 (응답, 상태, 헤더, 구성) { 반환 응답; }); }, }; }])
controller.js //이 함수는 컨트롤러에 있으며 다운로드 버튼이 눌려지면 trigered가됩니다. $ scope.downloadSampleFile = function () { // 백엔드에서 응답으로 반환 된 Blob을 수락하기 위해 문서에 숨겨진 샘플 링크를 만듭니다. var downloadLink = document.createElement ( "a"); document.body.appendChild (downloadLink); downloadLink.style = "display : none"; //이 서비스는 다음과 같이 쓰여집니다. 다운로드 파일 .downloadfile (data) .then (function (result) { var fName = result.filename; var file = 새로운 Blob ([result.data], {type : 'application / *'}); var fileURL = (window.URL || window.webkitURL) .createObjectURL (file); // Blob, window obj의 도움으로 생성 된 URL에 브라우저 특정 다운로드 팝업을 가지고 생성 된 클라이언트 측 객체. downloadLink.href = fileURL; downloadLink.download = fName; downloadLink.click (); }); }; services.js .factory ( 'downloadFile', [ "$ http", function ($ http) { 반환 { downloadfile : function () { return $ http.get (// 여기에 요청을 보낼 서버 끝점 , { responseType : 'arraybuffer', 매개 변수 : { // 필수 매개 변수 }, }). 다음 (함수 (응답, 상태, 헤더, 구성) { 반환 응답; }); }, }; }])
from https://stackoverflow.com/questions/17177303/spring-download-response-as-a-file by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 좋은 아이디어 로깅을 위해 Spring AOP를 사용하고 있습니까? (0) | 2019.01.11 |
---|---|
[SPRING] 최대 절전 모드를 사용하여 Oracle에서 LARGE BLOB (> 100MB)를 유지하는 방법 (0) | 2019.01.11 |
[SPRING] Tomcat 5.5에서 web-app를 배포 할 때 listenerStart 오류를 해결하는 방법은 무엇입니까? (0) | 2019.01.11 |
[SPRING] 메소드에서 Spring @ Transactional 어노테이션에 대한 설명 (0) | 2019.01.11 |
[SPRING] CRUDRespository의 업데이트 또는 SaveUpdate, 사용 가능한 옵션이 있습니까? (0) | 2019.01.11 |