요구 사항 : 파일 다운로드 기능이있는 웹 페이지를 구현하고 주로 압축 패키지 및 사진을 다운로드합니다.
1 : 하이퍼 링크를 통해 다운로드하십시오
HTML 페이지에서 하이퍼 링크를 통해 다운로드 할 파일 주소로 링크
<! docType html> <html> <head> <meta charset = "utf-8"> <title> 제목 삽입 </title> </head> <hody> <h1> 링크를 통해 파일 다운로드 </h1> <a href = "/day06/download/cors.zip"> sporture </a >> <an downowl6/download/1.png. </body> </html>
Day06/다운로드가 문서 경로 인 경우이 예제의 프로그램 구조는 다음과 같습니다.
프로그램이 실행되면 다운로드 해야하는 문서를 클릭하여 다운로드 할 수 있습니다.
그러나 문제가 여기에 나타납니다. 즉, 압축 패키지를 다운로드하려면 클릭하면 다운로드 페이지가 나타나지 만 그림을 다운로드하면 브라우저가 사진을 직접 열고 다운로드가 없습니다.
하이퍼 링크를 통해 파일을 다운로드 할 때 브라우저가 파일 형식을 인식 할 수 있으면 브라우저가 직접 열리기 때문입니다. 다운로드는 브라우저가 파일 형식을 인식 할 수없는 경우에만 달성됩니다. 따라서 두 번째 방법은 다운로드 기능을 실현하는 데 사용됩니다.
2 : 서블릿 프로그램을 통해 다운로드를 구현하십시오
Servlet을 통해 파일을 다운로드하는 원칙은 Servlet을 통해 대상 프로그램을 읽고 리소스를 클라이언트에게 반환하는 것입니다.
<! docType html> <html> <head> <meta charset = "utf-8"> <title> 제목 삽입 </title> </head> <hody> <h1> 링크를 통해 파일 다운로드 </h1> <a href = "/day06/download/cors.zip"> sporture </a >> <an downowl6/download/1.png. <h1> 서블릿 프로그램을 통해 파일 다운로드 </h1> <a href = "/day06/servletdownload? filename = cors.zip"> 압축 패키지 </a> <a href = "/day06/servletdownload? filename = 1.png"> 그림 </a> </body> </html>
/day06 /servletdownload가 서블릿 프로그램의 매핑 경로 인 다음 새 서블릿, 이름 서블릿 다운로드 및 URL이 /servletdownload에 매핑됩니다.
다음과 같이 코드를 추가하십시오.
패키지 com.lsgjzhuwei.servlet.response; import java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputstream; import java.io.outputStream; javax.servlet.servletexception import; javax.servlet.annotation.webservlet import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * 서블릿 구현 클래스 서플렛 다운로드 */@webservlet (asyncsupported = true, urlpatterns = { "/servletdownload"}) public class servletdownload는 httpservlet {private static final long serialversionuid = 1L; / ** * @httpservlet#httpservlet () */ public servletdownload () {super (); // TODO 자동 생성 생성자 Stub}/** * @ @httpservlet#doget (httpservletrequest 요청, httpservletreponse responsk) */protected void doget (httpservletrequest request, httpservletrequest 요청), httpservletreponse 응답) servletexception, ioxcture // got to-goded methuge voctor voception // to-goded method em 이름 문자열 filename = request.getParameter ( "filename"); System.out.println (filename); // 파일 MIME 유형 응답을 설정합니다 .SetContentType (getServletContext (). getMimeType (filename)); // 컨텐츠 예측 응답을 설정합니다 .SetHeader ( "Content-Disposition", "첨부 파일; filename ="+filename); // 대상 파일을 읽고 응답을 통해 대상 파일을 클라이언트에 쓰기 // 대상 파일의 절대 경로를 가져옵니다. string fullFilename = getServletContext (). getRealPath ( "/download/" + filename); //system.out.println(fullfilename); // inputStream in = new FileInputStream (fullFilename)을 읽습니다. outputStream out = response.getOutputStream (); // 파일 쓰기 int b; while ((b = in.read ())! = -1) {out.write (b); } in.close (); out.close (); } / ** * @ @httpservlet#dopost (httpservletrequest request, httpservletresponse response) * / protected void dopost (httpservletrequest 요청, httpservletrepsonse 응답) servletexception, ioexception {// auto-genated method}}}} Tomcat 서버를 다시 시작하여 압축 패키지 및 사진의 다운로드를 실현하십시오.
삼. 팁 :
파일을 다운로드하는 방법은 링크를 클릭하는 것이 매우 간단합니다. 배경은 파일 스트림을 출력하고 위치 및 파일 스토리지에 대한 문의를 포함하여 브라우저를 통해 다운로드 기능을 인식합니다. 대부분의 브라우저는 고정 된 위치를 구성하고 매번 묻지 않을 수 있습니다.
프론트 엔드는 <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에서 파일을 얻으려면 이것이 작동합니다.