2016-06-25 2 views
0

아약스 호출을 통해 호출 된 아래 코드를 사용하여 Excel 파일을 만듭니다. 다운로드 버튼을 클릭하면 Excel 파일이 루트 위치에서 생성됩니다. 하지만 사용자가 저장/저장하라는 메시지를 파일로 볼 수 없습니다. 엑셀의 내용이 나오는 브라우저의 응답 탭을 볼 수 있습니다. 하지만 다른 이름으로 저장 대화 상자 옵션이 필요합니다. 이 문제를 해결할 수있는 코드 아래의 수정 사항은 무엇입니까? 다음은 Excel 파일을 통해 서블릿 다운로드

  final Date date = new Date(); 
      final String generateDate= new SimpleDateFormat("yyyy-MM-dd").format(date); 
      final String filename = form_name+"-extraction-"+generateDate.toString()+".xls"; 
      final FileOutputStream fileOutputStream = new FileOutputStream(filename); 
      workbook.write(fileOutputStream); 
      downloadFile(filename, response); 

다운로드 파일 방법 :

private void downloadFile(final String fileName, final SlingHttpServletResponse response){ 
     try { 
      final File f = new File(fileName); 
      response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "inline; filename="+fileName); 
      response.setHeader("Pragma", "public"); 
      response.setHeader("Cache-Control", "no-store"); 
      response.addHeader("Cache-Control", "max-age=0"); 
      FileInputStream fin = null; 
      try { 
       fin = new FileInputStream(f); 
      } catch (final FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      final int size = 1024; 
      try { 
       response.setContentLength(fin.available()); 
       final byte[] buffer = new byte[size]; 
       ServletOutputStream os = null; 

       os = response.getOutputStream(); 
       int length = 0; 
       while ((length = fin.read(buffer)) != -1) { 
        os.write(buffer, 0, length); 
       } 
       fin.close(); 
       os.flush(); 
       os.close(); 
      } catch (final IOException e) { 
       e.printStackTrace(); 
      } 
     }catch (final Exception ex){ 
      LOGGER.error("ERROR IS ::: {}",ex.getMessage()); 
    } 

답변

1

처분 유형 (대문자와 소문자를 구별하지 않고로) "첨부 파일"을 일치하는 경우 , 이받는 사람이
을 저장하라는 메시지를 표시해야 함을 나타냅니다 응답을 로컬로 처리하는 대신 로컬로 처리합니다 (해당 미디어
유형).

반면에 "inline"(대소 문자를 구분하지 않음)과 일치하면 이 기본 처리를 의미합니다. 따라서 처리 유형 "인라인"은 파일 이름 (아래 참조)과 같은 추가 매개 변수가 추가 된 경우에만 유용합니다.

알거나 처분되지 않은 형식 "첨부 파일"로
수신자가 동일한 방식으로 처리되어야한다 (또한, [RFC2183]
2.8 절 참조).

그래서 당신은 당신의

response.setHeader("Content-Disposition", "inline; filename="+fileName); 

호출을 다운로드하는 대신 파일을 표시하도록 브라우저를 강제하고 있습니다. "인라인"대신 "첨부 파일"을 사용해야합니다.

response.setHeader("Content-Disposition", "attachment; filename="+fileName); 

자세한 내용은 Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)을 참조하십시오.

+0

또한 Ajax 호출에 문제가 있습니다. http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-i-e-some-info-in-body. 숨겨진 필드를 사용하여 전화를 받으십시오. –

+1

@VivekDhiman 실제로 파일을 디스크 [FileSaver.js] (https://github.com/eligrey/FileSaver.js)에 저장할 수있는 자바 스크립트 라이브러리가 있습니다. 또는 큰 파일로 작업 할 경우 [StreamSaver.js] (https://github.com/jimmywarting/StreamSaver.js)를 사용할 수 있습니다. – Onur

0

이전에 검색된 데이터 출력이 Excel에서 채워지면 정적 선언을 제거해야합니다. 예 :

private static hasmap hs = new hashmap(); 
관련 문제