웹 애플리케이션 시스템의 개발에서 파일 업로드 및 다운로드 기능은 일반적으로 사용되는 기능입니다. 오늘은 Javaweb에서 파일 업로드 및 다운로드 기능의 구현에 대해 이야기 해 봅시다.
파일 업로드의 경우 브라우저는 업로드 프로세스 중에 스트림 형식으로 파일을 서버에 제출합니다. 서블릿을 직접 사용하여 업로드 된 파일의 입력 스트림을 얻은 다음 요청 매개 변수를 구문 분석하는 것이 더 번거 롭습니다. 따라서 일반적으로 Apache 오픈 소스 도구의 파일 업로드 구성 요소 인 Common-FileUpload를 사용하도록 선택됩니다. Common-FileUpload 업로드 구성 요소의 JAR 패키지는 Apache 공식 웹 사이트에서 다운로드하거나 Struts의 Lib 폴더 아래에서 찾을 수 있습니다. Struts 업로드의 기능은이 구현을 기반으로합니다. Common-FileUpload는 Common-IO 패키지에 따라 다르 므로이 패키지도 다운로드해야합니다.
1. 개발 환경 구성
PileUploadandDowndown 프로젝트를 작성하고 Apache의 Commons-FileUpload 파일 업로드 구성 요소의 관련 JAR 패키지를 추가하십시오.
2. 파일 업로드를 구현하십시오
2.1. 파일 업로드 페이지 및 메시지 프롬프트 페이지
upload.jsp 페이지의 코드는 다음과 같습니다.
<%@ page language = "java"pageencoding = "utf-8"%> <! doctype html> <html> <head> <title> 파일 업로드 </title> </head> <body> <form action = "$ {pagecontext.Request.ContextPath}/servhoadlleServlet"inctype = "tyspart/upload-servle" user : <입력 유형 = "text"name = "username"> <br/> 파일 업로드 1 : <input type = "file"name = "file1"> <br/> 파일 업로드 2 : <input type = "file"name = "file2"> <br/> <input type = "value ="제출 "> </body> </html> code for message) 일반 사본 인쇄? <%@ page language = "java"pageencoding = "utf-8"%> <! doctype html> <html> <head> <title> 메시지 프롬프트 </title> </head> <body> $ {message} </body> </html>2.2. 파일 업로드를위한 서블릿 처리
업로드 핸들러 레스트 코드는 다음과 같습니다.
me.gacl.web.controller를 패키지; import java.io.file; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputstream; Java.util.list 가져 오기; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; Public Class UploadHandleServlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse response)을 servletexception, ioexception {// 업로드 된 파일의 저장된 디렉토리를 가져오고, 업로드 된 파일로부터 업로드 된 파일을 보장하지 못하게 할 수 없게합니다. this.getServletContext (). getRealPath ( "/web-inf/upload"); 파일 = 새 파일 (savepath); // 업로드 된 파일의 저장된 디렉토리가 존재하는지 판단합니다. // 디렉토리 파일을 만듭니다 .mkdir (); } // message prompts string message = ""; {// Apache 파일 업로드 구성 요소를 사용하여 파일 업로드 단계를 처리하려면 : // 1. DiskFileItemFactory Factory DiskFileItemFactory Factory = New DiskFileItemFactory ()를 만듭니다. // 2. 파일 업로드 Parser ServletFileUpload 업로드 = New ServletFileUpload (Factory); // 중국인의 garbled 업로드를 해결합니다 .SetheAderEncoding ( "UTF-8"); // 3. 제출 된 데이터가 if (! servletfileupload.ismultipartContent (request)) {// 기존 방식으로 데이터를 반환하는 경우 업로드 양식의 데이터인지 결정하십시오. } // 4. ServletfileUpload 파서를 사용하여 업로드 된 데이터를 구문 분석하십시오. 구문 분석 결과는 <fileitem> 컬렉션 목록을 반환합니다. 각 fileItem은 양식 양식 목록의 입력 항목에 해당합니다. for (fileitem item : list) {// 일반 입력 항목의 데이터가 파일에 캡슐화 된 경우 (item.isformfield ()) {String name = item.getfieldName (); // 일반 입력 항목의 데이터의 중국어가 달린 문제를 해결하십시오. 문자열 값 = item.getString ( "UTF-8"); // value = new String (value.getBytes ( "iso8859-1"), "utf-8"); System.out.println (name + "=" + value); } else {// 파일 항목이 업로드 된 파일을 캡슐화하는 경우 // 업로드 된 파일 이름, String filename = item.getName (); System.out.println (filename); if (filename == null || filename.trim (). equals ( "")) {계속; } // 참고 : 다른 브라우저에서 제출 한 파일 이름은 다릅니다. 일부 브라우저는 다음과 같은 경로가있는 파일을 제출하고 일부는 다음과 같은 간단한 파일 이름입니다. 1.txt // 처리 된 파일의 파일 이름의 경로 부분은 업로드 된 파일의 경로 부분을 처리합니다. 파일 이름 부분만이 Filename = filename.substring ( "//"); // INPUTSTREAM in = item.getInputStream ()에서 업로드 된 파일의 입력 스트림을 가져옵니다. // 파일 생성 스트림 스트림 파일 OutputStream out = 새 FileOutputStream (SavePath + "//" + filename); // 버퍼 바이트 버퍼 만들기 [] = 새로운 바이트 [1024]; // 입력 스트림의 데이터가 읽었는지 여부를 식별하는 것은 int len = 0입니다. //The input stream is read into the buffer loop, (len=in.read(buffer))>0 means that there is still data in in while((len=in.read(buffer))>0){ //Use FileOutputStream output stream to write the buffer data to the specified directory (savePath + "//" + filename) out.write(buffer, 0, len); } // 입력 스트림을 닫아 in.close (); // 출력 스트림을 닫아 out.close (); // 파일을 처리 할 때 생성 된 임시 파일을 삭제합니다. 업로드 item.delete (); Message = "파일 업로드가 성공적으로 업로드되었습니다!"; }}}} catch (예외 e) {message = "파일 업로드 실패!"; e.printstacktrace (); } request.setAttribute ( "message", message); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}web.xml 파일에 uploadhandleservlet를 등록하십시오
<Servlet> <Servlet-name> uploadHandleServlet </servlet-name> <servlet-class> me.gacl.web.controller.uploadhandleservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> uploadHandleserVlet </servlet-name> <Url-pattern>/servandle </urll-pattern> </servlet-mapping>
작동 효과는 다음과 같습니다.
파일이 성공적으로 업로드 된 후 업로드 된 파일은 아래 그림과 같이 Web-Inf 디렉토리의 업로드 디렉토리에 저장됩니다.
2.3. 파일 업로드의 세부 사항
위의 코드는 서버의 지정된 디렉토리에 파일을 성공적으로 업로드 할 수 있지만 파일 업로드 기능에주의를 기울여야하는 작은 세부 사항이 많이 있습니다. 다음 사항은 특별한주의를 기울여야합니다.
1. 서버의 보안을 보장하기 위해서는 Web-INF 디렉토리와 같이 외부 세계에서 직접 액세스 할 수없는 디렉토리에 업로드 파일을 배치해야합니다.
2. 파일 덮어 쓰기를 방지하려면 파일 업로드를 위해 고유 파일 이름을 생성해야합니다.
3. 너무 많은 파일이 디렉토리 아래에 나타나는 것을 방지하려면 해시 알고리즘을 사용하여 스토리지를 분해해야합니다.
4. 업로드 된 파일의 최대 값은 제한되어야합니다.
5. 업로드 된 파일의 유형을 제한하려면 업로드 된 파일 이름을 수신 할 때 접미사 이름이 합법적인지 확인하십시오.
위의 5 가지 세부 문제에 대한 응답으로 업로드 핸들 서비스를 개선하겠습니다. 개선 된 코드는 다음과 같습니다.
me.gacl.web.controller를 패키지; import java.io.file; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputstream; Java.util.list 가져 오기; java.util.uuid import; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.fileuploadbase; import org.apache.commons.fileupload.progresslistener; import org.apache.commons.fileupload.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; / ** * @className : uploadHandleServlet * @Description : TODO (이 클래스의 기능을 설명하기 위해 하나의 문장을 사용합니다) * @Author : @author : @author : ruisurate canglang * @date : 2015-1-3 11:35:50 pm */ public uploadHandleServlet httpservlet {httpervlet rowes rowes httpervlet rowes) servletexception, ioexception {// 업로드 된 파일의 저장된 디렉토리를 가져오고 업로드 된 파일을 웹 -inf 디렉토리에 저장하고 업로드 된 파일의 보안을 보장하기 위해 외부 세계에서 직접 액세스 할 수 없습니다. string savepath = this.getServletContext ( "/web-inf/upload"); // 업로드 중에 생성 된 임시 파일은 디렉토리 문자열 temppath = this.getServletContext (). getRealPath ( "/web-inf/temp")에 의해 저장됩니다. 파일 tmpfile = 새 파일 (temppath); if (! tmpfile.exists ()) {// 임시 디렉토리 생성 tmpfile.mkdir (); } // 메시지가 string message = ""를 프롬프트합니다. {// Apache 파일 업로드 구성 요소를 사용하여 파일 업로드 단계를 처리하려면 : // 1. DiskFileItemFactory Factory DiskFileItemFactory Factory = New DiskFileItemFactory ()를 만듭니다. // 공장 버퍼의 크기를 설정합니다. 업로드 된 파일 크기가 버퍼의 크기를 초과하면 지정된 임시 디렉토리에 임시 파일이 생성되고 저장됩니다. Factory.SetSizetHreshold (1024*100); // 버퍼 크기를 100KB로 설정합니다. 지정되지 않은 경우 버퍼 크기는 기본적으로 10KB입니다. // 업로드 공장에서 생성 된 임시 파일의 스토리지 디렉토리를 설정합니다. // 2. 파일 업로드 Parser ServletFileUpload 업로드 = New ServletFileUpload (Factory); // 파일 업로드 업로드 업로드 업로드를 듣습니다. 현재 처리 된 14608 : 7367 파일 크기는 다음과 같습니다. 14608, 현재 처리되었습니다 : 11419 파일 크기는 다음과 같습니다. 14608, 현재 처리 : 14608 */}}); // 중국인의 garbled 업로드를 해결합니다 .SetheAderEncoding ( "UTF-8"); // 3. 제출 된 데이터가 if (! servletfileupload.ismultipartContent (request)) {// 기존 방식으로 데이터를 반환하는 경우 업로드 양식의 데이터인지 결정하십시오. } // 업로드 된 단일 파일의 크기의 최대 값을 설정하고 있으며 현재 1024*1024 바이트, 즉 1MB upload.setfilesizemax (1024*1024)로 설정됩니다. // 업로드 된 파일의 총 최대 값을 설정합니다. 업로드 된 파일 수, 최대 값 = 동시에 업로드 된 여러 파일의 최대 크기의 합은 현재 10MB ubload.setSizemax (1024*1024*10)로 설정됩니다. // 4. ServletfileUpload 파서를 사용하여 업로드 된 데이터를 구문 분석하십시오. 구문 분석 결과는 목록 <fileItem> 컬렉션을 반환하고, 각 fileItem은 양식 양식 목록의 입력 항목에 해당합니다. for (fileitem item : list) {// 파일이 일반 입력 항목의 데이터를 캡슐화하는 경우 (item.isformfield ()) {문자열 이름 = item.getfieldName (); // 일반 입력 항목의 데이터의 중국어가 달린 문제를 해결합니다. 문자열 값 = item.getString ( "utf-8"); // value = new String (value.getBytes ( "iso8859-1"), "utf-8"); System.out.println (name + "=" + value); } else {// 파일이 업로드 된 파일을 캡슐화하는 경우 // 업로드 된 파일 이름, String filename = item.getName (); System.out.println (filename); if (filename == null || filename.trim (). equals ( "")) {계속; } // 참고 : 다른 브라우저에서 제출 한 파일 이름은 다릅니다. 일부 브라우저는 다음과 같은 경로와 함께 파일 이름을 제출하는 반면, 일부 브라우저는 다음과 같은 간단한 파일 이름입니다. 1.txt // 처리 된 파일 이름의 파일 이름의 경로 부분은 업로드 된 파일의 경로 부분을 처리합니다. 파일 이름 부분 만 필레나 이름 = filename.substring ( "//"); // 업로드 된 파일의 확장자를 가져옵니다. string fileExtName = filename.substring (filename.lastIndexof ( ".")+1); // 업로드 된 파일 유형을 제한 해야하는 경우 파일 확장자를 사용하여 업로드 된 파일 유형이 법률 system.out.println인지 결정할 수 있습니다 ( "업로드 된 파일의 확장자는 다음과 같습니다."+fileExtName); // INPUTSTREAM in = item.getInputStream ()에서 업로드 된 파일의 입력 스트림을 가져옵니다. // 파일의 이름을 저장된 string savefilename = makefilename (filename); // 파일을 가져 오기 디렉토리 저장 문자열 realSavePath = makePath (SaveFilename, SavePath); // 파일 출력 스트림 파일 스트림 파일 OutStream out = new FileOutputStream (realSavePath + "//" + SaveFilename); // 버퍼 바이트 버퍼 만들기 [] = 새로운 바이트 [1024]; // 입력 스트림의 데이터가 읽었는지 여부를 결정하는 것은 int len = 0입니다. //The input stream is read into the buffer, (len=in.read(buffer))>0 means that there is still data in in while((len=in.read(buffer))>0){ //Use FileOutputStream output stream to write the buffer data to the specified directory (savePath + "//" + filename) out.write(buffer, 0, len); } // 입력 스트림을 닫아 in.close (); // 출력 스트림을 닫아 out.close (); // 파일을 처리 할 때 생성 된 임시 파일을 삭제합니다. 업로드 //item.delete (); Message = "파일 업로드가 성공적으로 업로드되었습니다!"; }}} catch (fileUploadBase.FileSizelimiteXeceedEdexception e) {e.printstacktrace (); request.setattribute ( "메시지", "단일 파일의 최대 값이 초과됩니다 !!!"); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); 반품; } catch (fileUploadBase.SizelimiteXeceedEdexception e) {e.printstacktrace (); request.setAttribute ( "메시지", "업로드 된 파일의 총 크기는 한계의 최대 값을 초과합니다 !!!"); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); 반품; } catch (예외 e) {message = "파일 업로드 실패!"; e.printstacktrace (); } request.setAttribute ( "message", message); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); } /*** @method : makefilename* @description : 파일 이름을 다음과 같이 업로드 한 파일의 파일 이름을 생성합니다. uuid+ "_"+ 파일의 원래 이름* @Anthor : 发官网* @param filename 파일의 원본 이름* @return uuid+ "_"+ filename (string filename) (string filename). // 파일 덮어 쓰기를 방지하려면 파일 업로드하려면 고유 한 파일 이름을 생성해야합니다. return uuid.randomuuid (). tostring () + "_" + filename; } / *** 너무 많은 파일이 디렉토리 아래에 나타나는 것을 방지하려면 해시 알고리즘을 사용하여 스토리지* @method : makepath* @description :* @anthor : @angogant wolf** @param filename 파일 이름을 기반으로 스토리지 디렉토리를 기반으로 스토리지 디렉토리를 생성합니다. SavePath) {// 파일 이름의 해시 코드 값을 가져 오면 메모리에서 문자열 객체 파일 이름의 주소 int hashcode = filename.hashcode (); int dir1 = 해시 코드 & 0xf; // 0--15 int dir2 = (Hashcode & 0xf0) >> 4; // 0-15 // 새 저장 디렉토리 구조 디렉토리 문자열 dir = savepath + "//" + dir1 + "//" + dir2; // 업로드/2/3 업로드/3/5 // 파일은 파일과 디렉토리 파일 = 새 파일 (dir)을 모두 나타낼 수 있습니다. // 디렉토리가 존재하지 않는 경우 (! file.exists ()) {// 디렉토리 파일을 만듭니다 .mkdirs (); } return dir; } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}위에서 언급 한 5 개의 작은 세부 사항을 개선 한 후 파일 업로드 기능이 비교적 완성되었습니다.
3. 파일 다운로드
3.1. 다운로드 할 수있는 파일 리소스를 나열하십시오
웹 애플리케이션 시스템의 파일 리소스를 사용자에게 다운로드 할 수 있도록 제공하고자합니다. 먼저 업로드 된 파일 디렉토리에 모든 파일을 나열 할 페이지가 있어야합니다. 사용자가 파일 다운로드 하이퍼 링크 다운로드를 클릭하면 다운로드하고 웹 애플리케이션 시스템에 다운로드 된 모든 파일을 나열하기 위해 ListFilesErvlet을 작성합니다.
ListFileservlet 코드는 다음과 같습니다.
me.gacl.web.controller를 패키지; import java.io.file; import java.io.ioexception; java.util.hashmap import; java.util.map import; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; / ** * @className : ListFileserVlet * @Description : 웹 시스템에 다운로드 된 모든 파일을 나열하십시오 * @Author : @Author : arearche * @date : 2015-1-4 9:54:40 PM * */ public class listfileservlet 확장 httpservlet {public void do (httpserverquest request, httpservercone 응답) servlecection elscuection elscuection elscuection elscue). // 파일 업로드를위한 디렉토리를 가져옵니다. 문자열 업로드 FilePath = this.getServletContext (). getRealPath ( "/web-inf/upload"); // 다운로드 할 파일 이름을 다운로드 할 수 있습니다. <string, String> filenamemap = new Hashmap <string, String> (); // FilePath 디렉토리의 모든 파일과 디렉토리를 재귀 적으로 가로 지르고 맵 수집 ListFile에 파일 이름을 저장합니다 (새 파일 (uploadFilePath), FileNamemap); // 파일 또는 디렉토리를 나타낼 수 있습니다. request.getRequestDispatcher ( "/listfile.jsp"). FORMPER (요청, 응답); } /*** @method : listfile* @description : 지정된 디렉토리의 모든 파일을 재귀 적으로 통과시킵니다.* @Anthor : @Param 파일은 파일을 의미하며 파일 이름을 나타내는 파일* /public void listFile (파일 파일, map <문자열, 문자열>지도)을 나타냅니다. 파일이 파일을 나타내지 않지만 (!) // 디렉토리 파일에 모든 파일과 디렉토리를 나열 파일 파일 [] = file.listfiles (); // 파일 전송 [] 배열 (파일 f : 파일) {// 재귀 ListFile (f, map); }} else { /*** 파일 이름을 처리합니다. 업로드 된 파일의 이름은 UUID_File 이름의 형식으로 이름이 바뀌 었습니다. 문자열에서 "_"문자의 위치를 검색하려면 파일 이름 file.getname (). indexof ( "_")의 uuid_ 부분을 제거하십시오. 파일 이름이 9349249849-88343-8344_A_FAN_DAVI.AVI, FILE.GETNAME (). substring (file.getName (). indexof ( "_")+1)를 A_FAN_DAVI.AVI PART*/ String RealName =를 얻을 수 있습니다. file.getName (). substring (file.getName (). indexof ( "_")+1); //file.getName () 파일의 원래 이름을 가져옵니다. 이 이름은 독특하므로 키로 사용할 수 있습니다. RealName은 처리 된 이름입니다. 반복 될 수 있습니다. map.put (file.getName (), realName); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }} 여기서는 ListFilesErvlet의 ListFile 메소드에 대해 간단히 이야기합니다. ListFile 메소드는 디렉토리에 모든 파일을 나열하는 데 사용됩니다. ListFile 메소드는 재귀를 사용합니다. 실제 개발에서 우리는 데이터베이스에 테이블을 생성 할 것입니다.이 테이블은 업로드 된 파일 이름과 파일의 특정 스토리지 디렉토리를 저장합니다. 테이블을 쿼리하여 파일의 특정 스토리지 디렉토리를 알 수 있으며 재귀 작업을 사용할 필요가 없습니다. 이 예제는 데이터베이스가 업로드 된 파일 이름과 파일의 특정 스토리지 위치를 저장하지 않기 때문에 업로드 된 파일의 스토리지 위치는 스토리지를 분해하는 데 사용되므로 재귀가 필요합니다. 재귀 중에, 획득 된 파일 이름은 맵 컬렉션에 저장되어 외부에서 ListFile 메소드로 전달되므로 모든 파일이 동일한 맵 수집에 저장되도록 할 수 있습니다.
web.xml 파일에서 ListFilesErvlet을 구성하십시오
<Servlet> <servlet-name> listfileservlet </servlet-name> <servlet-class> me.gacl.web.controller.listfileservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> listfileservlet </servlet-name> <url-pattern> </listfileservlet> </urlervtern-
다운로드 된 파일을 표시하는 ListFile.jsp 페이지는 다음과 같습니다.
<%@ page language = "java"import = "java.util.*"pageEncoding = "utf-8"%> <%@ taglib prefix = "c"uri = "http://java.sun.com/jsp/jsp/jstl/core"%> <! apttype html> <head> <head> <head> <head> <head> <head> <head> <!-트래버스 맵 수집-> <c : foreach var = "me"items = "$ {filenamemap}"> <c : url value = "/servlet/downloadservlet"var = "downurl"> <c : param name = "filename"value = "$ {me.key}"> </c : param> </c : url> $ {me.value} <a. href = "$ {downurl}"> 다운로드 </a> <br/> </c : foreach> </body> </html> ListFileserVlet에 액세스하면 아래 그림과 같이 ListFile.jsp 페이지에서 다운로드 할 수있는 파일 리소스를 표시 할 수 있습니다.
3.2. 파일 다운로드 구현
파일 다운로드 처리를위한 서블릿을 작성하십시오. DownloadServlet의 코드는 다음과 같습니다.
me.gacl.web.controller를 패키지; import java.io.file; import java.io.fileInputStream; import java.io.ioexception; import java.io.outputStream; import java.net.urlencoder; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class downloadservlet는 httpservlet {public void doget (httpservletrequest request, httpservletresponse 응답)을 servletexception, ioexception {// 다운로드 할 파일 이름을 가져옵니다. filename = request.getParameter ( "filename"); //23239283-92489-avatar.avi filename = new String (filename.getBytes ( "iso8859-1"), "UTF-8"); // 업로드 된 파일은/web-inf/ubload directory string filesaverootpath = this.getServletContext (). getRealPath ( "/web-inf/upload")의 하위 디렉토리에 저장됩니다. // 파일 이름으로 파일이있는 디렉토리를 찾으십시오. String path = findFilesavePathByFilename (filename, filesaverootpath); // 파일을 다운로드 할 파일을 가져옵니다. 파일 = 새 파일 (path + "//" + filename); // 파일이 존재하지 않으면 (! file.exists ()) {request.setAttribute ( "message", "다운로드하려는 리소스가 삭제되었습니다 !!"); request.getRequestDispatcher ( "/message.jsp"). FORMPER (요청, 응답); 반품; } // 파일을 처리하는 이름 문자열 realname = filename.substring (filename.indexof ( "_")+1); // 파일 응답을 다운로드하려면 브라우저를 제어하도록 응답 헤더를 설정합니다 .SetHeader ( "Content-Disposition", "첨부 파일; filename =" + urlencoder.encode (realName, "UTF-8")); // 다운로드 할 파일을 읽고 파일 입력 스트림에 저장 파일 파일 inputStream in = new FileInputStream (path + "//" + filename); // 출력 스트림 생성 outputStream out = response.getOutputStream (); // 버퍼 바이트 버퍼를 만듭니다 [] = 새로운 바이트 [1024]; int len = 0; // 루프 입력 스트림의 내용을 버퍼로 읽습니다. } // 파일 입력 스트림을 닫아 in.close (); // 출력 스트림을 닫아 out.close (); } /*** @method : findFilesaveAppithByFilename* @description : 파일 이름 및 스토리지 루트 디렉토리를 통해 다운로드 할 파일의 경로를 찾으십시오.* @Anthor : 发官网* @param filename 다운로드 할 파일 이름을 다운로드 할 루트 디렉토리를 업로드하기위한 루트 디렉토리* /up-inf /up-inf /up-inf-inf /up-inf hiptory. FindFilesAvePathByFileName (String filename, String SaverootPath) {int hashcode = filename.hashcode (); int dir1 = 해시 코드 & 0xf; // 0--15 int dir2 = (Hashcode & 0xf0) >> 4; // 0-15 String dir = saverootpath + "//" + dir1 + "//" + dir2; // 업로드/2/3 업로드/3/5 파일 파일 = 새 파일 (DIR); if (! file.exists ()) {// directory file.mkdirs ()를 작성합니다. } return dir; } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}web.xml 파일에서 다운로드 서비스를 구성합니다
<Servlet> <servlet-name> downloadservlet </servlet-name> <servlet-class> me.gacl.web.controller.downservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> downloadservlet </servlet-name> <url-pattern/servlet/downloadservlet </url-panttern>
[다운로드] 하이퍼 링크를 클릭하고 요청을 다운로드 서비스에 제출하고이를 처리하여 파일 다운로드를 달성하십시오. 작동 효과는 아래 그림에 나와 있습니다.
실행 결과에서 파일 다운로드 기능이 파일을 정상적으로 다운로드 할 수 있음을 알 수 있습니다.
위의 내용은 편집자가 소개 한 파일 업로드 및 다운로드 예에 대한 가장 자세한 설명입니다 (권장). 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!