1. 파일 업로드 원리 분석
1. 파일 업로드에 필요한 전제 조건
에이. 양식의 방법은 게시되어야합니다
비. 양식의 ENCTEPE 속성은 유형의 멀티 파트/양식 데이터이어야합니다.
ENCTYPE 기본값 : 응용 프로그램/x-www-form-urlencoded
기능 : 요청 텍스트의 마임 유형에 서버를 알려줍니다.
Application/X-WWW-Form-urlencoded : username = abc & password = 123
servletrequest.getParameter (문자열 이름); 이 방법은이 유형을 구체적으로 읽는 메소드입니다.
멀티 파트/양식 데이터 :
2. Commons-FileUpload 구성 요소를 사용하여 파일을 업로드하십시오
에이. JAR 패키지를 복사하십시오 : Commons-FileUpload.jar Commons-io.jar
비. 구현 원리
3. 쓰레기 코드 문제
에이. 일반 필드의 쓰레기 코드
fileItem.getString (String charset); 인코딩은 클라이언트와 일치해야합니다
비. 업로드 된 중국어 파일 이름이 차단되었습니다.
request.setcharacterencoding ( "UTF-8"); 인코딩은 클라이언트와 일치해야합니다
4. 특정 구현
프론트 데스크 업로드 코드는 다음과 같습니다.
<%@ page language = "java"import = "java.util.*"pageEncoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 Transitional // en"> <html> <head> <title> 파일 업로드 </title> <meta http-equiv = "pragma" content = "no-cache"> <meta http-equiv = "cache-control"content = "no-cache"> <meta http-equiv = "만료"content = "0"> <!-<link rel = "Stylesheet"type = "text/css"href = "styles.css"> </head> <form> <form> < action = "$ {pagecontext.request.contextpath}/servlet/uploadservlet3"method = "post"enctype = "multipart/폼-데이터"> 이름 : <input name = "name"/> <br/> file1 : <input type = "file"name = "f1"/> <br/> file2 : <input type = "file" "f2"input type = "value ="upload "> </form> </body> </html>백그라운드 서블릿 코드
패키지 com.ithema.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.io.usupportedencodingException; import java.util.list; import java.util.uuid; import javax.servletexcemplem; javax.servlet.http.httpservlet; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.http.httpervletresponse; import org.apache.commons.fileuplead.fileitem; import org.apache.commons.fileupload.fileoploat org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; import 또는 org.appualkache.commons.io.filameutils; // 묘사 uploadservlet3 확장 httpservlet {public void doget (httpservletrequest request, httpservletresponse response)는 servletexception, ioexception {request.setcharacterencoding ( "utf-8"); response.setcontentType ( "text/html; charset = utf-8"); response.getwriter (); system.out.print (request.getRemoteaddr ()); 부울 ismultipart = servletfileUpload.ismultipartContent (request); if (! ismultipart) {새로운 runtimeexception ( "multipart/form-data"); diskfileitemfactory (); servletfileUpload parser = new servletfileUpload (dfif); // parser.setfilesizemax (3*1024*1024); // 단일 파일 업로드 크기를 설정 // parser.setsizemax (6*1024*1024); {items = parser.parserequest (request);} catch (fileUploadbase.filesizelimitexeceedEdexception e) {out.write ( "uploadfile은 3M"); return;} catch (fileUploadBase.SizelimitexeceedException e) { "총 파일 6m"; e) {e.printstacktrace (); 새로운 runtimeexception ( "Parse Upload Content, 다시 시도하십시오");} // 요청 된 내용을 if (items! = null) {for (fileItem item : items) {if (item.isformfield ()) {processformfield (항목);} else {processuploadfield (it}}} out.write ( "upmently!"). ProcessUploadfield (fileItem item) {try {string {string filename = item.getName (); // if (filename! = null &&! filename.equals ( "")) {filename = uuid.randomuuid (). toString ()+"+"+filenameUtils.getName); // extension string string (filenameutils.getname); // filenameutils.getextension (filename); // mime 유형 문자열 contenttype = item.getContentType (); if (contentType.startSwith ( "image/")) {// date now = new Date (); // dateformat df = new SimpledateFormat ( "yyyy-mm-dd"); df. format (now); // 파일 이름 문자열의 해시 코드에 따라 스토리지 디렉토리를 계산합니다. string childdirectory = makechildDirectory (getServletContext (). getRealPath ( "/web-inf/files/"); stringStoredIrectoryPath = getServletContox (). storedirectory = 새 파일 (StoredirectoryPath); if (! storedirectory.exists ()) {storedirectory.mkdirs ();} system.out.println (filename); ite (새 파일 (storedirectorypath+file.separator+filename); // trupary files}} catch (Exception e) {whun runtineecction (upload, please upload, please upload, please upload); 저장된 하위 디렉토리 개인 문자열 MakeChildDirectory (String realPath, String filename) {int HashCode = Filename.hashCode (); int dir1 = hashcode & 0xf; // int dir2 = (hashcode & 0xf0) >> 4; // 5 ~ 8 bits string director = "+dir1+file 1+file+dir1. file (realpath, directory); if (! file.exists ()) file.mkdirs (); return directory;} private void processformfield (fileItem item) {String fieldname = item.getfieldName (); // field name String fieldValue; try {fieldValue = item.getString ( "utf-8") {in upportedEncemence runtimeexception ( "UTF-8 인코딩은 지원되지 않습니다");} system.out.println (FieldName+"="+fieldValue);} public void dopost (httpservletRequest 요청, httpservletResponse 응답) wrows servletexception, ioexception, ioexception (요청, 응답);5. 임시 문서와 관련하여
에이. DiskFileItemFactory
public void setRepository (파일 리포지토리) : 임시 파일이 저장된 디렉토리를 공개 void setsizethreshold (int sizethreshold) : 캐시 크기 설정
비.
파일을 업로드 할 때 파일을 사용하여 IO 스트림을 사용하여 직접 처리하십시오. 스트림이 닫힌 후 임시 파일을 삭제하십시오. fileitem.delete ()
FileItem.writer (File F)를 사용하는 것이 좋습니다. 임시 파일은 자동으로 삭제됩니다.
6. 파일 크기를 제한합니다
에이.
servletfileupload.setfilesizemax (3*1024*1024); // 단일 파일 업로드의 크기를 설정합니다
비.
servletfileupload.setsizemax (6*1024*1024); // 여러 파일을 업로드 할 때 총 크기 제한
위는 편집자가 소개 한 Commons FileUpload 구현 파일 업로드의 예제 코드입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!