2011-03-07 2 views
1

다운로드 버튼을 클릭 한 사용자를 위해 pdf 파일을 열어야합니다.파일을 만들지 않고 AJAX 호출을 사용하여 BLOB로 저장된 PDF 파일 내용을 출력하십시오.

다운로드 단추는 PDF 내용이 포함 된 데이터베이스의 blob 필드에서 데이터를 가져 와서 서블릿에 대한 ajax 호출을 작성하고 응답으로 리턴합니다.

응답을 PDF 파일로 사용자에게 다운로드하려면 어떻게해야합니까?

서블릿 코드는 다음과 같습니다 :

   response.setContentType("application/pdf"); 
       oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF"); 
       byte[] bytes = blob.getBytes(1, (int) blob.length()); 
       ServletOutputStream servletOutputStream = response.getOutputStream(); 
       servletOutputStream.write(bytes, 0, bytes.length); 
       servletOutputStream.flush(); 
       servletOutputStream.close(); 

은 내가 응답을 화재 버그를 확인 AJAX에 아래에있는 것과 같은 문자가 포함 된 긴 응답을받을 수 있습니다.

a J 㔎 ji 2K y 2 q 9 G ! % kɂ W mp) {h̕ S NJ_ A '2k j яR > wB e | = w p % w qǦ> ~ 1o 㾙 a a a a a a a a a a a a fM6K

나는 페이지를 제출하거나 URL에 쿼리 보여주는 보낸 매개 변수를 사용하여 서블릿 창을 팝업하지 않으

나는 또한 서버의 파일을 생성하지 않으

.

아약스 호출에서 오는 서블릿의 응답을하고 페이지 또는 iframe 브라우저에 표시 할 수있는 방법이 있나요 자동으로 파일을 다운로드합니다 ...

답변

2

Ajax를 사용하여 파일을 다운로드 할 수 없습니다. 그러나 숨겨진 IFRAME을 사용하면 동일한 '효과'를 얻을 수 있습니다. XMLHttpRequest를 사용하는 대신 숨겨진 iframe을 동적으로 생성하고 적절한 매개 변수를 사용하여 서블릿에 제출합니다. 응답이 오면 브라우저는 content-type/extension을 기반으로 컨텐츠를 자동으로 처리합니다. jQuery를 사용하는 경우 this plugin에이 기능이 내장되어 있습니다.

+0

'document.getElementById ('myform_1'). target = 'content_frame'; 양식 제출 '은 트릭을 수행했습니다 .... –

0

Rahulmohan과 같은 사운드는 그의 물건을 알고 있지만 응답 스트림에 파일 이름 헤더를 추가하는 것이 좋습니다. 내가 asp.net에서 유사하지만 아약스 환경과 내 코드와 당신 사이의 유일한 차이 일을하면이 라인 :

Response.AddHeader ("내용 - 처리", "첨부 파일, 파일 이름 ="& 파일 이름 & ".pdf")

내 페이지는 Ajax 환경에서 실행되지 않습니다.

+0

http 스펙에 따라 브라우저는 응답 내용 유형에 따라 응답을 처리하도록되어 있습니다. 그러나 다른 스펙과 마찬가지로, 그들은 편지에 따라 가지 않습니다. 예를 들어, IE는 콘텐츠 형식이 아닌 파일 확장명을 기반으로 콘텐츠를 처리합니다. 여러 브라우저에서 여러 번의 시행 착오를 거친 끝에 정확한 확장자를 가진 파일 이름과 올바른 내용 유형을 사용하는 것이 최선의 방법이라는 것을 알았습니다. 그러나 이전에 말했듯이 iframe을 사용해야합니다. – rahulmohan

+0

나는 당신이 틀림 없음을 의심하지 않습니다. Rahulmohan하지만 나는 당신의 제안을 따를 것이라는 확신이 없습니다. 언젠가는 미래에 언젠가 이것을해야 할 수도 있습니다.응답 스트림에 출력을 쓰는 페이지를 호스팅하는 숨겨진 iFrame을 생성하고 파일을 쓸 매개 변수가 포함 된 URL을 게시하여 업데이트합니다. – Mordy

관련 문제