복붙노트

[SPRING] Spring - 파일로서 응답을 다운로드한다.

SPRING

Spring - 파일로서 응답을 다운로드한다.

저는 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. ==============================

    1.XHR 요청을 통해 파일을 다운로드 할 수 없습니다 (Angular가 요청하는 방식 임). 왜 threre가 아약스 요청을 사용하여 파일을 다운로드 할 수 없는지보십시오. $ window.open을 통해 URL로 이동하거나 여기에 표시된 iframe 트릭을 수행해야합니다. JSON 데이터로 POST를 통해 파일을 다운로드하는 JavaScript / jQuery

    XHR 요청을 통해 파일을 다운로드 할 수 없습니다 (Angular가 요청하는 방식 임). 왜 threre가 아약스 요청을 사용하여 파일을 다운로드 할 수 없는지보십시오. $ window.open을 통해 URL로 이동하거나 여기에 표시된 iframe 트릭을 수행해야합니다. JSON 데이터로 POST를 통해 파일을 다운로드하는 JavaScript / jQuery

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

    2.나는 이것을 서버에서 작동 시키려고 노력했다. 그럴 수 없었다. 대신 ...

    나는 이것을 서버에서 작동 시키려고 노력했다. 그럴 수 없었다. 대신 ...

  3. ==============================

    3.XHR 요청을 사용하여 파일을 다운로드 할 수 있습니다. angular $ http를 사용하여 파일을로드 한 다음 HTML5의 Blob 기능을 사용하여 브라우저에서 저장할 수 있습니다. FileSaver.js를 저장하는 데 도움이되는 라이브러리가 있습니다.

    XHR 요청을 사용하여 파일을 다운로드 할 수 있습니다. angular $ http를 사용하여 파일을로드 한 다음 HTML5의 Blob 기능을 사용하여 브라우저에서 저장할 수 있습니다. FileSaver.js를 저장하는 데 도움이되는 라이브러리가 있습니다.

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

    4.네가 필요로하는 경우에 대비해서, 여기에 도움이되는 몇 가지 링크가 있습니다.

    네가 필요로하는 경우에 대비해서, 여기에 도움이되는 몇 가지 링크가 있습니다.

    건배

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

    5.그것은 나를 위해 일하고있다 :

    그것은 나를 위해 일하고있다 :

  6. ==============================

    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. ==============================

    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', 매개 변수 : { // 필수 매개 변수 }, }). 다음 (함수 (응답, 상태, 헤더, 구성) { 반환 응답; }); }, }; }])

  8. from https://stackoverflow.com/questions/17177303/spring-download-response-as-a-file by cc-by-sa and MIT license