웹 파일 다운로드에는 두 가지 유형이 있습니다. 하나는 파일이 웹 사이트 디렉토리에 있다는 것입니다. http://www.xxx.com/file.zip과 같은 브라우저에서 파일 경로를 직접 입력하여 다운로드 할 수 있습니다. 다른 유형은 파일이 웹 사이트 디렉토리에 있지 않거나 파일이 동적으로 생성된다는 것입니다 (내보내기 보고서 또는 내보내기 Excel 등). 이 경우 파일 다운로드는 응답의 출력 스트림을 통해 달성해야합니다. DownloadUtils는 파일 다운로드를 구현하기위한 다양한 정적 메소드를 제공하는 Java 웹 파일 다운로드 도구 클래스입니다.
패키지 com.rhui.util; import java.io.bufferedInputStream; import java.io.bufferedOutputStream; import java.io.file; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputstream; import java.io.outputStream; import java.net.urlencoder; import javax.servlet.http.httpservletresponse; import org.apache.commons.lang3.stringutils; / *** 파일 다운로드 클래스*/ public class downloadUtils {/ *** 파일 다운로드 인코딩*이 인코딩은 브라우저에 중국어 파일 이름을 다운로드 할 때 garbled 코드를 방지하기 위해 파일 이름의 인코딩 메소드를 알려줍니다. / *** 파일 다운로드* @param 응답* @param filepath 파일 이름*/ public static void download (httpservletresponse response, string filepath) {file file = new File (filepath.tostring ())을 포함하여 서버의 파일 경로. 다운로드 (응답, 파일, null, 인코딩); } /*** 파일 다운로드* @param response* @param filepath 파일 이름* @param filename을 포함하여 서버의 파일 경로를 브라우저에 다운로드 한 파일의 이름입니다. 브라우저에서 서버의 파일 이름과 동일하게 다운로드 한 파일 이름을 원하지 않으면이 매개 변수 */ public static void download (httpservletresponse 응답, 문자열 filepath, string filename) {file file = new File (fillepath.tostring ()); 다운로드 (응답, 파일, 파일 이름, 인코딩); } /*** 파일 다운로드* @param response* @param filepath 파일 이름* @param filename을 포함하여 서버의 파일 경로를 브라우저에 다운로드 한 파일의 이름입니다. 브라우저에서 서버의 파일 이름과 동일하게 파일 이름을 다운로드하지 않으려면이 매개 변수* @param 인코딩 파일 이름 인코딩*/ public static void download (httpservletresponse 응답, 문자열 파일, 문자열 파일 이름, 문자열 encoding) {파일 = 새 파일 (fillepath.tostring ()); 다운로드 (응답, 파일, 파일 이름, 인코딩); } /** * 파일 다운로드 * @param 응답 * @param 파일 파일 * @param filename 다운로드 된 파일의 이름을 브라우저에. 브라우저에서 서버의 파일 이름과 동일하게 파일 이름을 다운로드하지 않으려면이 매개 변수 */ public static void download (httpservletresponse 응답, 파일 파일) {다운로드 (응답, 파일, null, 인코딩); } /*** 파일 다운로드* @param 응답* @param 파일 파일* @param filename 다운로드 된 파일의 이름을 브라우저에. 브라우저에서 서버의 파일 이름과 동일하게 파일 이름을 다운로드하지 않으려면이 매개 변수 */ public static void download (httpservletresponse 응답, 파일 파일, 문자열 파일 이름) {다운로드 (응답, 파일, 파일 이름, encoding); } /*** 파일 다운로드* @param 응답* @param 파일 파일* @param filename 다운로드 된 파일의 이름을 브라우저에. 브라우저에서 서버의 파일 이름과 동일하게 파일 이름을 다운로드하지 않으려면이 매개 변수* @param 파일 인코딩*/ public static void download (httpservletResponse 응답, 파일 파일, 문자열 encoding) {if (file == null ||! file.exists () {| | isdirectory () {isdirectory () } // 브라우저에 다운로드 할 파일 이름을 지정하지 않으면 파일의 기본 이름을 사용하십시오 (stringUtils.isblank (filename)) {filename = file.getName (); } try {inputStream은 = new FileInputStream (file); 다운로드 (응답, IS, Filename, Encoding); } catch (ioexception e) {e.printstacktrace (); }} / *** 파일 다운로드* @param 응답* @param은 파일 입력 스트림입니다* @param filename 다운로드 파일 이름* @throws ioexception* / public static void download (httpservletResponse 응답, 입력 스트림 IS, 문자열 파일 이름) {다운로드 (응답, IS, Filename, Encoding); } / *** 파일 다운로드* @param 응답* @param은 파일 입력 스트림입니다* @param filename 파일 이름 다운로드* @param 인코딩 인코딩 형식* / public static void download (httpservletresponse 응답, 입력 스트림 IS, 문자열 파일 이름, 문자열) } bufferedInputStream bis = null; OutputStream os = null; BufferedOutputStream BOS = NULL; try {bis = new bufferedInputStream (IS); os = response.getoutputStream (); BOS = 새로운 BufferedOutputStream (OS); response.setContentType ( "Application/Octet-stream; charset =" + encoding); 응답 .SetchAracterEncoding (인코딩); response.setHeader ( "Content-Disposition", "첨부 파일; filename ="+ urlencoder.encode (filename, encoding)); 바이트 [] 버퍼 = 새로운 바이트 [1024]; int len = bis.read (버퍼); while (len! = -1) {bos.write (buffer, 0, len); len = bis.read (버퍼); } bos.flush (); } catch (ioexception e) {e.printstacktrace (); } 마침내 {if (bis! = null) {try {bis.close (); } catch (ioexception e) {}} if (is! = null) {try {is.close (); } catch (ioexception e) {}}}} public static string getencoding () {return encoding; } public static void setencoding (String encoding) {downloadUtils.encoding = 인코딩; }}파일이 서버의 비 사이트 디렉토리에 저장된 경우
문자열 filepath = "c : //file.zip"; DownloadUtils.Download (응답, FilePath);
파일이 입력 스트림 인 경우
// 파일 입력 스트림입니다. // filename은 브라우저에서 다운로드 한 파일 이름입니다. // 인코딩은 파일 string filename = "file.zip"에 중국어가있을 때 갈색 코드를 방지하는 파일 이름입니다. 문자열 인코딩 = "UTF-8"; downloadUtils.Download (응답, IS, FilEname, Encoding);
서블릿에서 파일을 다운로드하십시오
패키지 com.rhui.web.servlet; import java.io.ioexception; javax.servlet.servletexception import; javax.servlet.annotation.webservlet import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; com.rhui.util.downloadUtils 가져 오기; @webservlet ( "/download/servlet") public class downloadservlet는 httpservlet {private static final long serialversionuid = 1L; 보호 된 void service (httpservletrequest 요청, httpservletresponse 응답) servletexception, ioexception {string filepath = "c : //file.zip"; DownloadUtils.Download (응답, FilePath); }} 추신 : 그림 다운로드 (도난 방지 링크 기능 포함)
패키지 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 (요청, 응답); }}