2009-10-06 4 views
7

Google은 잠시 동안 답변을 요청했지만 해결 방법을 찾지 못했습니다.브라우저 다운로드 완료 이벤트

우리는 동적으로 생성되어 서블릿에서 제공되는 파일 (pdfs)을 다운로드 할 수있는 웹 서버가 있습니다. 다운로드가 언제 완료되었는지 (그리고 어떻게 성공했는지, 실패했는지, 사용자가 취소했는지) 알고 싶습니다.

사용자 입력없이이를 알 수있는 방법이 있습니까? 이러한 파일은 상대적으로 작기 때문에 진행 표시 줄 기능은 필요하지 않지만 다운로드가 완료되면 다시보고하는 일종의 "엔드 훅"이 필요합니다. 이것이 가능한가?

[편집] 브라우저 엔드에서 다운로드 종료를 감지하고 ajax를 통해 서버에 다시보고 할 수있는 기능은 무엇입니까?

답변

3

네트워크 오류가 발생하지 않는 한 알 수 없습니다. 유일한 방법은 다운로드가 성공적으로 완료되었음을 확인하기 위해 브라우저에 AJAX를 사용하여 서버에 두 번째 이벤트를 보내도록하는 것입니다.

+2

다운로드가 성공적으로 완료되었는지 브라우저에서 어떻게 알 수 있습니까? 그게 사실 내 질문의 요지 였어, 내가 더 명확하게 편집 하겠어. – laura

+9

이 대답은 왜 받아 들여 졌습니까? 우리는 브라우저가 다운로드가 완료되었음을 어떻게 알 수 있습니까? – abyx

+0

로라, 왜이 답변을 얻었습니까?) – dnim

1

setContentLength 메서드를 ServletResponse으로 사용하면 파일 크기가 작더라도 사용자는 오류와 양호한 다운로드를 구분할 수 있으며 브라우저의 다운로드 관리자가 완료되면이를 알려줍니다.

2

서블릿에서 사용자 가끔이 감지 될 수 있습니다. 예를 들어, Tomcat을 사용하여 대용량 파일을 클라이언트로 스트리밍 한 다음 다운로드를 취소하십시오. 예외의 스택 추적은 logs/catalona.out에서 확인할 수 있습니다. 그러나 서블릿 자체 나 하위 레벨 (카탈리나 내부)에서 처리 할 수 ​​있는지는 잘 모르겠습니다.

일반적으로 이미지를 다운로드하는 데 사전로드 방식 (이벤트 수신기 시설)이 있습니다. 지원되지 않는 이미지로 브라우저에서 PDF 전체를 다운로드할지 여부는 브라우저에 달려 있지만 그렇지 않은 경우 시도해 볼 가치가 있습니다. Here이 그 예입니다.

또 다른 해결책은 암시 적으로 <object> 또는 <embed> 태그를 사용하여 PDF를 다운로드하고 해당 onload 이벤트 리스너를 사용하는 것입니다. 브라우저에서 ActiveX 또는 일종의 PDF 파일 연결이 수행 된 경우에만 작동하며 사용자가 PDF 뷰어를 갖고 있지 않으면 작동하지 않을 수 있습니다. 은이를 입증하는 예입니다 (지원 솔루션 참조 : 11/21/04 08:22 AM, ID : 12638846).

모흐센 당신은 직접 브라우저에 연결된 서버 (TCP 연결의 엔드 포인트)에서 꽤 좋은 아이디어를 얻을 수

6

. 사용자가 다운로드를 취소하거나 네트워크 문제가 발생하면 서버에서 입출력 오류가 발생합니다. 따라서 프록시를 사용하지 않고 서버를 직접 실행할 수있는 경우. 당신은

try { 
     response.setContentType("application/pdf"); 
     response.setContentLength(bytes.length); 
     ServletOutputStream ouputStream = response.getOutputStream(); 
     ouputStream.write(bytes, 0, bytes.length); 
     ouputStream.flush(); 
     ouputStream.close(); 
     logger.info("PDF " + fileName + " sent successfully"); 
    } catch (Exception e) { 
     logger.error("PDF " + fileName + " error: " + e.getMessage()); 
     throw e; 
    } 

그러나, 여전히 사용자가 성공적으로 다운로드 후 브라우저에서 PDF를 볼 수있는 작은 기회가있다, 이런 식으로 뭔가를 할 수 있습니다. 브라우저의 ACK가 가장 좋은 방법입니다. PDF가 브라우저에 직접 표시되면 그렇게 할 수 없습니다. 어떤 종류의 Javascript PDF 뷰어를 사용하고 표시 될 때 서버에 콜백을 추가해야합니다.

1

브라우저는 기본적으로이 문제를 처리하지는 않지만 다운로드 요청을 처리하기 위해 Google 기어를 사용할 수 있습니다 (다운로드가 완료되면 성공 이벤트가 발생합니다).당신이 문서에서 이미지 필드를 삽입 할 수있는 경우

http://code.google.com/apis/gears/api_httprequest.html

0

, 이미지 HREF는 사용자가 PDF 문서를 열 것을 확인하기 위해 다시 서버에 가리킬 수 있습니다.

본인은 직접 시도하지 않았지만 last page of this adobe doc을 보았습니다.

Itext를 사용하는 경우 이미지 필드를 지원하지 않지만 이미지 필드가있는 pdf 템플릿을 사용하여 문서를 만들고 JavaScript를 추가하여 이미지 필드에 URL을 할당 할 수 있습니다.