2010-06-10 3 views
14

파일 다운로드를 요청하는 사용자에게 진행률 표시 줄을 표시해야합니다. 나는 파일을 생성하기 위해 J2EE 애플리케이션을 사용하고있다. 사용자가 양식 데이터를 제출하여 파일을 가져옵니다. 서버는 제출 된 모든 데이터를 처리하고 PDF 파일을 생성하여 클라이언트로 다시 보냅니다.서버에서 파일을 다운로드 할 때 진행률 표시 줄 표시

그래서 클라이언트 측에 파일이 나타날 때까지 사용자에게 진행률 표시 줄을 보여주고 싶습니다. 이렇게 할 방법이 있습니까?

+1

이 작업을 수행하는 방법을 알고 싶습니다. –

+0

파일을 생성하는 데 보통 얼마나 걸리나요? – cherouvim

+0

@cherouvim : 시간은 여기 정적 인 시간이 아닙니다. 파일마다 다릅니다. 최소 1 초에서 최대 20-30 분입니다. –

답변

9

잘 이해하면 서버에서 파일을 보낼 준비가 될 때까지 진행률 표시 줄을 표시하고 다운로드 한 파일의 진행 상태를 표시하지 않으려합니다.

이것이 사실이라면, 당신은 힘든 훈련을해야합니다. 신뢰할 수있는 진행 표시 줄은 현재 수행중인 작업과 소요 시간을 알 필요가 있습니다. 귀하의 경우 신뢰할 수없는 요소가 많이 있습니다 (그 중 하나, 아마도 가장 큰 것은 웹 자체).

그래서 대부분의 개발자는 "진행중인 작업"을 표시하기 위해 일종의 "끝이없는"애니메이션을 사용합니다.

갱신

는 귀하의 의견을 바탕으로하는 "진행중인 작업"을 표시하는 가장 쉬운 방법 애니메이션은 단일 요청의 경우

$.ajax({ 
    url:  "/myscripts/myserverscript", 
    type:  "POST", 
    data:  { 
     foo: "bar" 
    }, 
    dataType: "text", 
    beforeSend: function(xhr){ 
     // display a progress animation 
    }, 
    complete: function(xhr, status){ 
     // hide the animation 
    } 
    ... 
}); 

과 같을 것이다. show/hide 기능을 설정하기 위해 글로벌 AJAX 이벤트 핸들러 (.ajaxStart().ajaxStop())를 설정할 수도 있습니다.

참고 : .ajax(), .ajaxStart(), 서버 측 파일 생성에 대한 .ajaxStop()

+0

두 경우 모두 유효합니다. 다운로드되는 파일의 진행 상태를 아는 것이 좋습니다. 또는 서버가 파일을 보낼 준비가 될 때까지 진행률 표시 줄에 작업을 표시하면됩니다. –

+0

답변 해 주셔서 감사합니다. –

+1

"무한 대기"단순화를 위해 +1 – cherouvim

3

진행 표시 줄 :

우리는 서버가 파일을 생성 (초)을 필요로한다고 가정합니다. 이 이벤트는 원래 요청 인 차단 작업에 의해 트리거됩니다. 이 작업이 끝나면 파일이 생성되어 클라이언트에 다시 전달됩니다.

동시에 다른 요청 (ajax)을 통해 서버를 호출하고 현재 특정 사용자에 대해 생성 된 파일에 대한 백분율을 얻고 싶습니다. 여기

접착제 부분은 :

  • 원래 요구가 빈번한 간격으로 진행 (즉 매 10 %)을 저장할 필요가있는 파일을 생성한다. 이 데이터를 http 세션에 저장하면 정상적으로 작동합니다.
  • 다른 요청 (아약스)은 단순히 http 세션에서이 정보를 가져올 수 있어야합니다. http 세션에서 동기화 (직렬화 액세스)를 사용하면 일부 웹 응용 프로그램이 일반적으로하는 일은 불가능합니다. 다른 요청 (ajax)은 원래 요청이 완료 될 때까지 단순히 차단할 것이기 때문에 클라이언트 측에서
  • 이 모두 HTML + 자바 스크립트로 제공되어 (애니메이션 진행률 막대) 필요한 상호 작용을 제공합니다. 간격이 매우 거친 경우에도 (10 %에서 20 %에서 30 %로 점프) jQuery로 막대를 애니메이션 할 수 있습니다. 나는 과거에 한 번 해 봤는데 좋았어.파일 다운로드에 대한

진행 표시 줄 :

는 브라우저의 기본 대화 상자로이 탈퇴하는 것이 가장 좋습니다.

+0

html/java-script에서 파일 다운로드 정보를 어떻게 얻을 수 있는지 알고 싶습니까? 당신이 마지막으로 요점에 대해 더 많은 정보를 공유 할 수 있습니까? –

+0

서버 측에서이 정보를 제공하는 URL (예 : Java 서블릿)이 필요합니다 (간단히 http 세션의 백분율을 인쇄합니다). 평이한 텍스트 (예 : 20 %) 또는 JSON 또는 XML 중 어느 것이 사용자에게 의존하고 어떻게 클라이언트 측을 구현할 것인가에 달려 있습니다. 클라이언트 측에서는이 정보를 얻고 그에 따라 DOM을 수정하기 위해 jQuery를 통해 URL에 대한 비동기 요청을 수행합니다. 요청은 javascript 함수 setTimeout (..)을 통해 X 초마다 (3 초) 시작해야합니다. – cherouvim

+0

그런 종류의 접근 방식에 대해, 저는 일종의 COMET 방식을 제안 할 것이지 원시 AJAX 요청은 제안하지 않을 것입니다. – jAndy

0

자바에서는 입력 스트림을 중심으로 javax.swing.ProgressMonitorInputStream을 래핑하면되지만 서버가 청크 스트리밍 모드로 전송하지 않는 한 전체 응답을 읽으므로 화면에 아무런 의미가 없습니다. 첫 번째 바이트가 Java로 전달되기 전에 메모리에 저장됩니다.