웹 애플리케이션 시스템의 개발에서 파일 업로드 및 다운로드 기능은 오늘날 매우 일반적으로 사용됩니다.
파일 업로드의 경우 브라우저가 업로드 파일의 입력 스트림을 얻기 위해 직접 사용되는 경우 브라우저가 서버 측에 제출 한 다음 내부의 요청 매개 변수를 분석하는 경우. 문제가되므로 일반적으로 Apache의 Apache의 Apache를 사용 하여이 파일 업로드 구성 요소를 사용합니다. 이 Common-FileUpload 업로드 Component의 JAR 패키지는 Apache 공식 웹 사이트에서 다운로드 할 수 있습니다. 또는 Struts Lib 폴더에서 찾을 수 있습니다. Common-FileUpload는 Common-IO 패키지에 따라 다르 므로이 패키지를 다운로드해야합니다.
1. 개발 환경 구성
FileUploadAndDowndown 프로젝트를 작성하고 Apache Commons-FileUpload 파일을 추가하여 아래 그림과 같이 구성 요소의 관련 JAR 패키지를 업로드하십시오.
2. 파일 업로드를 구현하십시오
2.1, 파일 업로드 페이지 및 메시지 프롬프트 페이지
upload.jsp 페이지의 코드는 다음과 같습니다.
<%@ page language = "java"pageencoding = "utf-8"%> <! 파일 업로드 </head> <body> <form action = "$ {pagecontext.request.contextpath }/servlet/uploadHandleServlet "EncType ="multipart/form-data "method ="post "> 업로드 사용자 : <input type ="text "name ="username "> <br/> 파일 업로드 1 : <input type =" 파일 "이름 ="file1 "> <br/> 파일 업로드 2 : <input type ="file "name ="file2 "> <br/> <input type ="value = "value ="제출 "</ 양식> </body> </html>
Message.jsp의 코드는 다음과 같습니다.
<%@ page language = "java"pageencoding = "utf-8"%> <!
2.2 파일로 업로드 한 서비스를 처리하십시오
업로드 핸들러 레스트 코드는 다음과 같습니다.
Me.gacl.web.file; javax.httpservletrequest pservlet {public oid doget (httpservletrequest request, httpservletresponse 응답)은 servletexception, ioexception {// 업로드 된 파일의 보존 디렉토리를 적어 놓고 업로드 된 파일을 웹-인프 디렉토리에 저장합니다. Safe String SavePath = getServletContext () "/web-inf/upload"; ) &&! isdirectory ()) {system.out.println (savepath+"directory가 존재하지 않으면 만들어야한다"); "" "; try {// apache 파일을 사용하여 구성 요소 처리 파일 업로드 단계 업로드 단계 : // 1. 디스크 파일 요소 공장 공장 DiskFileiiitemFactory = newFileItem factor (); // 2. 파일 생성 파일 ServletFileUpload upload = New ServletFileUpload (New ServletFileUpload). 공장);/중국어가 달린 코드 업로드를 해결합니다. 업로드 파일 이름을 제시합니다 ( "UTF-8") {// 기존 방식에 따라 데이터를 얻습니다.} // 4. ServiceFileUpload Parser를 사용하여 데이터를 분석하고 업로드하십시오. 양식 입력 항목 목록에 해당합니다. Iff (item.isformfield ()) {string name = getfieldname (); // value = new String (value.getBytes ( "iso8859-1"), "UTF -8"); 캡슐화 된 파일의 이름, string filename = item.getname (filename); 계속;} // 참고 : 다른 브라우저에서 제출 한 파일 이름은 다르고 일부 브라우저는 다음과 같은 경로와 함께 파일 이름을 제출하며 일부는 다음과 같은 경로를 제출하며 일부는 단순한 파일 이름과 같은 간단한 파일 이름입니다. : 1.txt // 이름의 경로에서 처리, 파일 이름 만 파일 파일 이름 = filename.substring (filename.lastIndexof ( "//"); // ItputStream in =에서 업로드 파일에서 입력 스트림을 가져옵니다. item.getInputStream ();//파일 생성 파일 스트림 파일 OutStream out = SavePath + "//" + filename); 입력 스트림의 데이터가 완성 된 로고 int len = 0을 읽었는지 여부는주기가 버퍼로 흘러 나옵니다 (len = in.read (buffer)). in)> 0) {// 버퍼의 데이터를 지정된 디렉토리 (savepath + "//" + filename)로 작성합니다. close (); / / / /)는 처리 파일이 업로드 될 때 생성 된 임시 파일 ITM.Delete () 삭제합니다. ";}}} catch (예외 e) {message ="파일 업로드 실패! "; e.printstacktrace ();} request.setAttribute ("message ", message); request.getRequestDispatcher ("/message.jsp "). (요청, 응답);}}
web.xml 파일에 uploadhandleservlet를 등록하십시오
<Servlet> <servlet-name> uploadhandleservlet </servlet-name> <servlet-class> me.gacl.web.controller.uploadleservlet </servlet-class> </servlet> <serv> <servlet-name > uploadHandleServlet </servlet-name> <Url-pattern>/servlet/uploadHandleServlet </url-pattern> </servlet-mapping>
실행 효과는 다음과 같습니다.
파일이 성공적으로 업로드 된 후 업로드 된 파일은 아래 그림과 같이 Web-Inf 디렉토리의 업로드 디렉토리에 저장됩니다.
2.3. 파일의 세부 사항
위의 코드는 서버의 지정된 디렉토리에 성공적으로 업로드 할 수 있지만 파일 업로드 기능에주의가 필요한 작은 세부 사항이 많이 있습니다.
1. 서버의 보안을 보장하기 위해서는 업로드 파일을 웹 -inf 디렉토리와 같이 외부 세계가 직접 액세스 할 수없는 디렉토리에 배치해야합니다.
2. 파일 커버리지를 방지하려면 파일 업로드를 위해 고유 한 파일 이름을 생성해야합니다.
3. 디렉토리 아래에서 너무 많은 파일을 방지하려면 해시 알고리즘을 사용하여 스토리지를 분산시킵니다.
4. 업로드 파일의 최대 값을 제한합니다.
5. 업로드 파일의 이름을 수신 할 때는 금이 합법적인지 판단해야합니다.
위의 5 가지 세부 사항에 대한 응답으로 업로드 핸들 서비스를 개선하겠습니다.
Me.gacl.web.controller; javax.servletexcept. httpservlet .apache.commons.fileupload.progresslistener; @Author : 가용성 Wolf * @Date : 2015-1-3 PM 11:35:50 */ Public Class Upload Ex {public void doget (httpservletrequest 요청, httpservletrepsonse 응답) servletexception, ioexception {// preservation. 업로드 파일의 디렉토리는 Web-Inf 디렉토리에 저장되어 Safe String SavePath = getServletContext ( "/web-inf/upload"); 업로드는 디렉토리 스트링 testh = this.getServletContext (); 파일 tmpfile = 새 파일 (temppath); if (! tmpfile.exists ()) {// 생성 tmpfile.mkdir (); 메시지 프롬프트 메시지 = "" "" ""; 공장의 버퍼는 업로드 된 파일의 크기가 버퍼의 크기를 초과하면 임시 디렉토리에 지정된 스토어가 생성됩니다. Factory.setsizethreshold (1024*100); 버퍼의 크기는 100kb입니다. // 2. 파서 서비스 파일을 업로드 할 파일 생성 FileUpload 업로드 = 팩토리 (Factory); {시스템 .println ( "文件大小为 :" + pcontentlength + ", 当前已处理 :" + pbytesread); /*** 文件大小为 : 4096 : 14608, 当前已7367 파일의 크기는 다음과 같습니다. 14608, 현재 처리 : 11419 파일 크기는 다음과 같습니다. 14608, 14608 */}}); -8 "); // 3. 제출 된 데이터가 데이터인지 결정하십시오 (! servletfileUpload.ismultipartCont (request)) {// 기존 방식으로 데이터 리턴을 얻습니다. (1024*1024); servletfileupload 解析器解析上传数据 解析器解析上传数据, 解析结果返回的是一个 목록 <fileItem> 集合 集合, 每一个 fileItem 양식 <fileItem> list = upload.parserequest (fileItem 항목 : list ) {// 파일에 캡슐화 된 경우 일반 입력 항목의 데이터는 (itemformfield ()) {string name.getfieldname (); String value.getString ( "UTF-8"); + {// 파일 이름이 fileItem에서 업로드 된 경우, iteM.getName (); ") {계속;} // 참고 : 다른 브라우저에서 제출 한 파일 이름은 다르고 브라우저에서 제출 한 일부 파일은 다음과 같은 경로와 함께 있습니다. 1.txt // 획득 한 파일의 파일 이름을 처리하고 획득 한 파일의 파일 이름을 처리하고 filename = filename.substring (filename.lastindexof ( "//"); // 확장자 가져 오기 만 유지합니다. 업로드 된 파일 문자열 fileExtName = filename.substring (filename.lastIndexof ( "..") +1); System.out.println (업로드 된 파일의 확장은 : "+fileExtName); string savefilename = makefilename (filename) (savefilename, savepath); 새로운 바이트 [1024]; // 입력 스트림의 데이터가 int len = 0을 읽었습니다. ((len = in.read (buffer)) >> 0) {// 버퍼의 데이터를 지정된 디렉토리 (savepath + "//" + filename)에 쓴다. close (); // 출력 스트림을 끄십시오. ";}}} catch (fileUploadBase.FilesizelItizelItizelItiTiTeItScepception e) {e.printStackTrace (); request.setAttribute ("message ","단일 파일은 최대 값 !!! "); request.getRequestDispatcher ("/message.jsp "). forward (요청, 응답); return;} catch (fileUploadBase.SizelimiteXceException e) {e.printstacktrace (); "/message.jsp"). "; e.printstacktrace ();} request.setAttribute ("message ", message); request.getRequestDispatcher ("/message.jsp "). 업로드 파일의 이름, 파일 이름은 다음과 같습니다. * /private String makefileName (String filename) {//2.jpg // 파일 커버리지를 방지하려면 고유 한 파일 이름을 생성해야합니다. * 디렉토리 아래에서 너무 많은 파일을 방지하려면 해시 알고리즘을 사용하여 스토리지를 분산시키기 위해 * @Method * @description : * @anthor : 사용 가능한 늑대 * @param filename 파일 이름에 따라 스토리지 디렉토리를 생성하십시오. * @param savepath 파일 스토리지 경로* @return 새 스토리지 디렉토리*/private string makepath (String filename, String savepath) {// 파일 이름의 해시 코드 값은 filenam e -String 객체입니다. int hashcode = filename.hashcode (); "//" + dir2; 업로드/3/5 // 파일을 나타낼 수 있습니다. 파일 = 새 파일 (dir); file.exist ()) {// 디렉토리 파일을 만듭니다 .mkdirs ();} return dir;} public void dopost (httpservletrequest, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답);
위의 5 개의 작은 세부 사항을 개선 한 후 파일 업로드 기능이 더 완전합니다.
세, 파일 다운로드
3.1. 다운로드를 제공 할 파일을 나열합니다
웹 애플리케이션 시스템의 파일 리소스를 사용자에게 제공해야합니다. 먼저 파일을 클릭하면 하이퍼 링크를 다운로드 할 때 모든 파일을 나열해야합니다. 다운로드 작업이 수행됩니다. 웹 응용 프로그램 시스템에서 모든 다운로드 파일을 나열합니다.
ListFileservlet 코드는 다음과 같습니다.
Me.gacl.web.controller; javax.servlet.httpstpservletrequest; httpservletresponse;/*** Listfileservlet* cription : @author : @author : 사용 가능한 늑대* @ 날짜 : 2015-1. -4 9:54:40 **/ public class listfileservlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse) ows servletexception, ioexception {// 파일 업로드 문자열 업로드 파일 (whoeldfilepath = this.getServletContext)의 디렉토리를 확장합니다. /web-inf/ubload "); // 파일 이름 맵 <string, string> filenamemap = new Hashmap <string, string> (); 파일 및 디렉토리, 파일의 파일 이름을 ListFile (새 파일에 저장 (New FilePypath), filepypath); // 파일은 파일 또는 디렉토리를 모두 나타낼 수 있습니다. /listfile.jsp "). forward (요청, 응답);}/*** @method : listfile* @descripting : 지정된 디렉토리의 재귀 횡단 모든 파일* @anthor : 사용 가능한 늑대* @param 파일은 파일을 의미합니다. 또한 파일 디렉토리* @param 맵 저장 파일 이름 맵 수집*/ public void listfile (파일 파일, 맵 <문자열, 문자열>지도) {// 파일이 파일이 아니라 디렉토리 if (! 파일을 나타내는 경우)를 나타냅니다. .isfile ()) {// 디렉토리 파일에 모든 파일과 디렉토리를 나열합니다 [] = file.listfiles (); Map);}} else {/*** 파일 이름을 처리합니다. 업로드 된 파일은 파일 이름 파일의 UUID_ 부분에서 이름을 바꾸기 위해 UUID_ 파일 이름의 형식으로 이름이 바뀌 었습니다 첫 번째 "_"문자열에 파일 이름이 비슷한 경우 : 9349249849-88343-8344 파일. ") +1은 _ fan _ _ 达 .avi part*/string realName = file.getName () .SubString (file.getName (). indexof ("_ ")+1); // file.getName () 파일의 원래 이름을 가져옵니다. 이후의 이름은 map.put (file.getname ()), realName);}} public void void dopost (httpservletrequest request), ioexception {doget (요청, 응답 );}}
ListFileServlet의 ListFile 메소드에 대한 간단한 이야기는 ListFile 메소드가 파일 이름과 특정 스토리지 디렉토리에 사용됩니다. 쿼리 양식을 통한 파일의 디렉토리는 재귀 작업을 사용할 필요가 없습니다. 재귀를 위해 저장된 경우, 획득 된 파일 이름은 외부에서 ListFile 메소드로 저장됩니다.
Web.xml 파일에서 ListFilesErvlet을 구성하십시오
<Servlet> <servlet-name> listfileservlet </servlet-name> <servlet-class> me.gac l.web.controller.listfileservlet </servlet-class> </servlet-mapping> <servlet-name> listfileservlet </ servlet-name> <Url-pattern>/servlet/listfileservlet </url-pattern> </servlet-mapping>
다운로드 파일의 listfile.jsp 페이지는 다음과 같습니다.
<%@ page language = "java"image = "java.util.*"pageencoding = "utf-8"%> <%@ taglib prefix = "c"uri = "http://java.sun.com/jsp /jstl/core " %> <! doctype html> <html> <head> <title> 파일 디스플레이 페이지 </title> </head> <hod> <!-트래버스 맵 컬렉션-> <c : foreach var = "me"items = "$ {filenamemap}"> <c : url value = "/server/doubledservlet"var = "double"> <c : param name = "fileEname ="$ {me.key} "> </ C : param> </c : url> $ {me.value} <a href = "$ {doublel}"> 다운로드 </a> <br/> </c : foreach> </body> </html>
ListFilesErvlet을 방문하십시오. 아래 그림과 같이 ListFile.jsp 페이지의 사용자에게 제공된 파일 리소스를 표시 할 수 있습니다.
3.2. 파일 다운로드 구현
파일을 처리하기위한 서블릿을 작성하십시오. 다운로드 코드는 다음과 같습니다.
Me.gacl.web.controller import java.io.ioxception; javax.servlet.httpservletrequest; httpservletreponse {public void doget (httpservletrequest request). getParameter ( "filename"); // 23239283-92489- Avatar. /web-inf/upload 디렉토리. 파일이 존재하지 않는 경우 (! xists ()) {request.setattribute ( "메시지", "삭제하려는 리소스가 삭제되었습니다!"); 요청, 응답); 파일 이름 문자열 realname = filename.substring (filename.indexof ( "_") + 1); Encode (realName, "UTF-8"); // 다운로드 할 파일을 읽으십시오. pute infileinputStream in = new FileInputStream (path + "//" + filename; .GetPutStream (); // 버퍼 바이트 버퍼를 만듭니다. (buffer))> 0) {// 출력 버퍼의 내용은 파일을 구현합니다. / 출력 스트림 out.close ();}/ *** @method : findfilesaveAppPathByFilename* @description : 파일 이름과 파일 루트 디렉토리의 스토리지를 통해 다운로드 할 파일로 파일의 경로를 찾으십시오.* @anthor : e 다운로드 된 파일 이름* @param saverootpath 파일에서 저장된 루트 디렉토리, 즉/web-inf/ubload directory* @return으로 다운로드 할 파일의 스토리지 디렉토리를 다운로드 할 다운로드 할 수 있습니다*/ public string findfilesaveppilename (String filename, s tring saverootpath) {int hashcode.hashcode (); dir = saveroolpath + "//" + dir1 + "//" " + d ir2/3/5file 파일; if (! file.exists); )) {// 디렉토리 파일을 만듭니다 .mkdirs ();} return dir;} public void uest 요청, httpservlesponse 응답) servletexception, ioexception {doget (요청, 응답);}}
web.xml 파일에서 다운로드를 구성하십시오
<Servlet> <Servlet-name> 다운로드 </servlet-name> <servlet-class> me.g acl.web.controller.downloadservlet </servlet-class> </servlet> <servlet-map-map-map ping> <Servlet-name> downloadServlet </servlet-name> <url-pattern>/servlet/downloadservlet </url-pattern> </servlet-mapping>
[다운로드] 하이퍼 링크를 클릭하고 다운로드를 위해 요청을 제출하려면 파일 다운로드를 다운로드 할 수 있습니다.
작업 결과에서 파일 다운로드 함수가 이미 파일을 정상적으로 다운로드 할 수 있음을 알 수 있습니다.
이 기사는 "Java Upload Operation Skills"로 편집되었으며 모든 사람이 배우고 읽을 수 있도록 환영합니다.
Javaweb에서는 파일 업로드 및 다운로드 기능에 대한 내용이 너무 많습니다.