기본 아이디어 :
이전 아이디어는 사용자에게 파일을 저장하고 싶은 곳을 물어 보는 상자를 팝업 한 다음 다른 파일을 생성하여 거기에 넣는 것이 었습니다. 그러나 내 생각은 성공하지 못했습니다.
파일을 다운로드하는 방법은 링크를 클릭하는 것이 매우 간단합니다. 배경은 파일 스트림을 출력하고 위치 및 파일 스토리지에 대한 문의를 포함하여 브라우저를 통해 다운로드 기능을 인식합니다. 대부분의 브라우저는 고정 된 위치를 구성하고 매번 묻지 않을 수 있습니다.
프론트 엔드는 매우 간단하고 <a> 태그, href = "백엔드 메소드 주소"입니다. 하이퍼 링크에서 필요한 요구를 직접 사용할 수 없다면 JS로 쓸 수 있습니다.
Window.location.href = "백엔드 메소드 주소".
배경 방법으로 점프 한 후
문자열 filepath = this.getClass (). getClassLoader (). getResource ( ""). touri (). getPath () + "/exportpdf.pdf"; // 프로젝트 파일의 파일 경로는 outfile = 새 파일 (filepath); String filename = outfile.getName (); // 파일 이름을 가져옵니다. inputStream fis = new bufferedInputStream (new FileInputStream (filepath)); 바이트 [] buffer = new Byte [fis.available ()]; fis.read (버퍼); // 파일 읽기 스트림 fis.close (); response.reset (); // 결과 set response.addheader ( "content-disposition", "첨부 파일; filename =" + new String (filename.replaceall ( "", "") .getBytes ( "UTF-8"), "iso8859-1")); // 헤더 파일 이름 response.addheader ( "Content-length", "" + outfile.length ())를 반환합니다. // 헤더 파일 크기를 반환합니다. // 데이터 유형 설정 // 반환 바디 출력 가져 오른 outputStream os = new bufferedOutputStream (response.getOutputStream ()); os.write (버퍼); // 출력 파일 os.flush (); os.close ();
브라우저는 이러한 형태의 파일 출력을 직접 인식하고 대화 상자가 나타납니다.
이 방법은 링크 방법을 사용하여 백그라운드에서 조정해야합니다. AJAX 및 XMLHTTPREQUEST 메소드를 사용할 수 없습니다. 이러한 방식으로 리턴 된 파일 스트림은 메소드의 콜백 함수로 반환됩니다. 물론 JS에서 파일을 얻으려면 이것이 작동합니다.
예
패키지 cn.itcast.day06.web.servlet; import java.io.ioexception; import java.io.inputStream; import java.io.outputStream; import java.net.urlencoder; import javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.httpervletrongronge; public class downloadservlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse response)을 삭제합니다. servletexception, ioexception {// anti-theft chain 함수를 구현하십시오. if (referer == null ||! referer.startswith ( "http : // localhost") {// 링크 도둑 응답입니다 .SendRedirect ( "/day06/index.jsp"); 반품 ; } // 응답 문제 해결 중국어가 달린 응답 응답 .setContentType ( "Text/Html; charset = utf-8"); // 메시지 본문의 인코딩 설정 // HTTP 응답 메시지 헤더는 HTTP 프로토콜을 통해 전송 된 중국어로 표시 될 수 없으며 중국어는 URL에 인코딩 된 문자열 필레나 이름 = urlencoder.encode ( "beauty.jpg", "utf-8"); // 브라우저에 리소스 응답을 읽도록 통지합니다 .SetHeader ( "Content-Disposition", "첨부 파일; filename ="+filename); // 이미지 데이터를 읽고 IE 브라우저 문자열 webpath = "/download/beauty.jpg"로 보냅니다. "; // 현재 웹 응용 프로그램의 경로와 동일합니다 ServletContext ServletContext = super.getServletContext (); inputStream in = servletcontext.getResourceasstream (webpath); outputStream out = response.getOutputStream (); int len; 바이트 [] 버퍼 = 새로운 바이트 [1024]; while ((len = in.read (buffer))! = -1) out.write (buffer, 0, len); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}