2011-11-06 3 views
0

JSF 페이지에 명령 링크가 있습니다. 링크를 클릭하면 모달이 열립니다. 모달의 다운로드 단추가 선택되고 입력 필드에 대해 유효성 검사가 수행 된 다음 파일이 다운로드됩니다. 요구 사항은 파일을 성공적으로 다운로드 한 후 모달을 닫고 같은 페이지로 돌아가는 것입니다. 같은 파일에 Open File 대화 상자가 나타나면 어떻게 닫을 수 있습니까?JSF 2.0에서 파일 다운로드 성공 후 모달 닫기

<h:panelGroup rendered="#{downloadBacking.showDownloadModal}"> 
    <ui:include src="DownloadFile.xhtml" /> 
</h:panelGroup> 

showDownloadModal 필드는 viewscoped bean에 정의됩니다.

모달로 다운로드 버튼을 클릭하면 downloadFile() 메서드가 호출됩니다.

public String downlaodFile(){ 
    // response.getwriter.write(string); 
    showDownloadModal = false; 
    return ""; 
} 

답변

1

귀하의 downloadFile() 방법은 그렇게 작동하지 않습니다. 요청 당 응답 만 보낼 수 있습니다. 파일 다운로드는 이미 자체적으로 전체 응답입니다. 다른 데이터를 추가 할 수 없습니다. 해당 데이터로 다운로드 한 파일 만 손상됩니다. 또는 다운로드 파일 코드를 올바르게 작성한 경우 IllegalStateException: response already committed도 확인해야합니다. 일부 JS 코드의 도움으로 다운로드 링크의 클릭에 즉시

  1. 닫기 대화 :

    당신은 두 가지 옵션이 있습니다.
    <h:commandButton value="Download" action="#{bean.downloadFile}" 
        onclick="some JS code here to hide the modal" /> 
    
  2. 는 파일 서버의 임시 디스크를 저장 (또는 메모리에 byte[]는 크기가 아닌 경우) 당신이 대화 상자를 숨기고 조건이 파일을 가리키는 일부 JS window.location 렌더링에있어서 같은 페이지로 돌아갑니다. 다운로드 한 파일을 실제로 생성/생성해야 할 경우 특히 유용합니다. 이는 시간이 많이 걸릴 수 있습니다.

    <h:panelGroup rendered="#{bean.downloadReady}"> 
        <script>window.location = '#{bean.downloadURL}';</script> 
    </h:panelGroup> 
    

    URL은 디스크 또는 메모리에서 파일을 스트리밍하는 간단한 서블릿을 가리킬 수 있습니다.

+0

파일 서버의 임시 디스크를 저장하는 방법을 알려주시겠습니까? 또한 파일을 저장하기 위해 또 다른 Servlet 클래스를 생성해야합니까 아니면 백킹 빈의 코드 만 좋을까요? – user679526

+0

'File.createTempFile (접두어, 접미사)'. 예, 서블릿을 작성해야합니다. 이는 JSF의 책임이 아닙니다. – BalusC

+0

백업 빈에서 임시 파일을 생성하고 임시 파일에 내용을 복사했습니다. 나는 서블릿을 만들었다. 어떻게하면 빈에서 서블릿으로 임시 파일을 전달할 수 있습니까? 나는 혼란 스럽다. 제발 도와주세요. – user679526