개발 중에 파일 업로드 및 다운로드는 매우 일반적입니다. 간단한 요약은 다음과 같습니다.
1. 파일 업로드를 위해 충족 해야하는 조건 :
에이. Get에 의해 전송 된 데이터가 너무 작기 때문에 페이지 양식의 방법은 게시해야합니다.
비. 페이지 양식의 ENCTYPE는 Multipart/Form-Data 유형이어야합니다.
기음. 이 양식은 입력 필드 코드 업로드에 대한 세부 정보를 제공합니다. 클라이언트 양식 : <form encType = "multipart/form-data"/>
(이 속성을 사용할 수없는 경우 서버에서 읽은 파일 경로는 브라우저에 따라 다릅니다)
Server ServletInputStream은 = request.getInputStream (); 추가 분석을 위해 스트림에서 요청 본문 내용을 얻습니다.
2. 파일 업로드의 세부 사항 :
(1) 양식 유형을 Multipart/Form-Data로 설정하는 이유. Key = 값이 아닌이 양식에 의해 전달되는 값을 설정하는 것입니다. 전달되는 것은 바이트 코드입니다.
양식과 요청 사이의 서신 :
위에서 볼 수 있듯이 양식 유형을 다음과 같은 것으로 설정 한 후 Multipart/Form-Data로 설정 한 후 선택한 파일은 쿠키 아래의 임의 문자열 아래의 위 그림에 표시된 것처럼 HTTP 요청 본문에서 이진으로 초기화됩니다.
그러나 파일 바이트 코드에는 식별 파일 (즉, 임의 문자열 문자열), 즉 첫 번째 컨텐츠 파일 헤더 및 빈 줄 라인으로 나눈 두 개의 특수 문자 라인이 있습니다. 그 후 세 번째 줄은 이진 파일 내용입니다.
따라서 서버가 클라이언트가 업로드 한 파일을 수락하면 HTTP 요청 매개 변수에서 파일 바이너리를 얻을 때 처음 세 줄을 제거해야합니다.
3. 업로드 된 TXT 파일을 수동으로 구문 분석합니다.
import java.io.bufferedReader; import java.io.ioexception; import java.io.inputStream; import java.io.inputStreamReader; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.httpservlet; import; javax.servlet.http.htttp.httpservletrequest; import javax.servlet.http.htttp.httpservletresponse;/** * 양식 유형이 게시되고 Enctype가 멀티 파트/양식 날짜 * 인 경우 모든 데이터는 이진 모드에서 서버로 전달됩니다. * 따라서 req.getParameter ( "xxx")는 항상 null입니다. * req.getInputStream ()을 통해서만 데이터를 얻고 텍스트의 데이터를 얻을 수 있습니다 * * @author wangxi * */public class upservlet는 httpservlet {public void dopost (httpservletrequest req) servletexception, ioexception (ioexception) (witception httpservletresponse, httpservletresponse)을 확장 할 수 있습니다. 문자열 txt = req.getParameter ( "txt"); // 리턴은 null system.err.println ( "txt is :"+txt); System.err.println ( "========================================"); inputStream in = req.getInputStream (); // byte [] b = new Byte [1024]; // int len = 0; // while ((len = in.read (b))! = -1) {// string s = new String (b, 0, len); // system.err.print (s); inputStreamReader (in)); String Firstline = br.readline (); // 첫 번째 줄을 읽고 첫 번째 줄은 구분 된 기호입니다. filename.substring (filename.length () -1); if (firstline+"-") {break. 4. Apache-FileUpload를 사용하여 파일 업로드를 처리합니다.
프레임 워크 : 사용자가 종종 코드로 처리하는 비즈니스를 캡슐화하는 것을 말합니다. 사용자가 쉽게 전화 할 수 있습니다.
현재 파일을 업로드하는 (프레임) 구성 요소입니다.
아파치-파일 푸로로드-
orialiy cos 2008 () -
JSP-Smart-Upload 200m.
FileUpload를 사용하여 파일을 업로드하십시오.
타사 패키지 가져와야합니다.
Apache-Fileupload.jar 파일은 핵심 패키지를 업로드합니다.
Apache-Commons-Io.jar이 패키지는 FileUpload 용 종속성 패키지입니다. 또한 툴킷이기도합니다.
핵심 범주 :
DiskFileItemFactory는 디스크 공간을 설정하고 임시 파일을 저장합니다. 그냥 수업.
ServletFileUpload- 파일 업로드의 핵심 클래스로 요청 및 구문 분석을받습니다.
servletfileupload.parserequest (requdest) - 목록 <fileitem>
Note: A FileItem is the beginning of a logo: --------243243242342 To -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 단계 : 패키지 가져 오기 :
2 단계 : Dopost 메소드를 완료하기위한 서블릿 작성
/*** DiskFileItemFactory에 의해 구성된 두 매개 변수* 첫 번째 매개 변수 : SizetHreadhold- 캐시 (메모리)에 저장할 데이터의 바이트 수를 설정하면 기본값은 10K* 파일이 10K보다 큰 경우 메모리를 사용하여 파일에 직접 저장할 수 있습니다. * 파일이 10K보다 큰 경우 파일을 먼저 임시 디렉토리에 저장해야합니다. * 두 번째 매개 변수 파일은 임시 디렉토리 위치 * */public class up2servlet httpservlet {public void dopost (httpservletrequest req, httpservletreponse resp)가 servletexception, ioexception {req.setcharacterencoding ( "utf-8")을 말합니다. // 프로젝트의 경로를 가져옵니다. String path = GetServletContext (). getRealPath ( "/up"); // 첫 번째 단계는 디스크에서 임시 디렉토리를 설정하는 데 사용되는 DiskFileItemFactory Factory 클래스를 선언합니다. 디스크 파일 Factory 디스크 = New DiskFileItemFactory (1024*10, 새 파일 ( "/home/wang/")); // 두 번째 단계 : ServletFileUpOload를 선언하고 위의 임시 디렉토리를 수신하고 servletfileUpload up = new ServletfileUpload (디스크); // 세 번째 단계 : 구문 분석 요청 시도 {list <fileItem> list = up.parserequest (req); // 파일 파일 만 파일 파일 = list.get (0); // 경로로 파일 이름을 가져옵니다. string filename = file.getName (); filename = filename.substring (filename.lastindexof ( "//")+1); // 파일 유형을 가져옵니다. String filetype = file.getContentType (); // 파일의 바이트 코드 inputStream in = file.getInputStream ()을 가져옵니다. // 출력 바이트 스트림 outputStream out = new FileOutputStream (path+"/"+filename); // 파일 복사 바이트 [] b = 새로운 바이트 [1024]; int len = 0; while ((len = in.read (b))! = -1) {out.write (b, 0, len); } out.close (); long size = file.getInputStream (). avide (); // 업로드 된 임시 파일 파일을 삭제합니다 .delete (); // 데이터 표시 resp.setContentType ( "text/html; charset = utf-8"); printwriter op = resp.getwriter (); op.print ( "파일 업로드 된 파일 <br/> 파일 이름 :"+filename); op.print ( "<br/> 파일 유형 :"+filetype); op.print ( "<br/> 파일 크기 (바이트)"+크기); } catch (예외 e) {e.printstacktrace (); }}}5.이 프레임 워크를 사용하여 여러 파일을 업로드하십시오.
1 단계 : 페이지 양식을 여러 입력 유형으로 수정 = "파일"
<form action = "<c : url value = '/up3servlet'//>"method = "post"encTepe = "multipart/form-data"> file1 : <input type = "file"name = "txt"> <br/> file2 : <입력 유형 = "file"name = "txt"> <br/> input type = "제출"/compon>
2 단계 : 트래버스 목록
Public Class UP3Servlet는 httpservlet {public void dopost (httpservletrequest 요청, httpservletresponse 응답)를 servletexception, ioexception {request.setcharacterencoding ( "utf-8"); 문자열 path = getServletContext (). getRealPath ( "/up"); // 디스크 선언 디스크 파일 족 변덕 디스크 = new DiskFileItemFactory (); 디스크 .SetSizetHreshold (1024*1024); 디스크 세트 레피 성 (새 파일 ( "d :/a")); // 요청을 구문 분석하는 서블릿을 선언합니다. 시도 {// 요청 목록을 해결합니다 <fileitem> list = up.parserequest (요청); // 목록 선언 <map> 업로드 된 파일 목록의 데이터를 캡슐화 <map <string, string >> ups = new ArrayList <map <String, String >> (); for (fileItem file : list) {map <string, string> mm = new Hashmap <String, String> (); // 파일 이름을 가져옵니다. string filename = file.getName (); filename = filename.substring (filename.lastindexof ( "//")+1); String filetype = file.getContentType (); inputStream in = file.getInputStream (); int size = in.available (); // 도구 클래스 fileUtils.copyInputStreamTofile (in, 새 파일 (path+"/"+filename)); mm.put ( "filename", filename); mm.put ( "filetype", filetype); mm.put ( "size", "+size); ups.add (mm); file.delete ();} request.setAttribute ("ups ", ups); // powner request.getRequestDisPatcher ("/jsps/show.jsp ")위는 파일을 업로드하는 일반적인 방법입니다. 이제 FileUpload의 다른 검색 API를 살펴 보겠습니다.
FileItem이 파일 (type = file) 객체인지 또는 텍스트인지 결정하십시오 (type = text | checkbox | radio) 객체 :
부울 isformfield () 텍스트 인 경우 | checkbox | radio | 선택, 값은 참입니다.
6. 설명 정보가 포함 된 그림을 처리하십시오
공개 클래스 updeScservlet는 httpservlet {public void dopost (httpservletrequest request, httpservletresponse response)를 servletexception, ioexception {request.setcharacterencoding ( "utf-8"); // getervletcontext ().); DiskFileItemFactory 디스크 = 새로운 DiskFileItemFactory (); 디스크 세트 레피 성 (새 파일 ( "d :/a")); try {servletfileupload up = new ServletfileUpload (디스크); 목록 <fileItem> list = up.parserequest (요청); for (fileItem file : list) {// 1 단계 : If (file.isformfield ()) {String filename = file.getFieldName (); // <입력 유형 = "text"name = "desc"> = desc string value = file.getString ( "utf-8"); System.err.println (filename+"="+value); } else {// 파일 문자열 filename = file.getName ()임을 나타냅니다. filename = filename.substring (filename.lastindexof ( "//")+1); file.write (새 파일 (path+"/"+filename)); System.err.println ( "파일 이름은 :"+filename); System.err.println ( "파일 크기는 :"+file.getSize ()); file.delete (); }}} catch (예외 e) {e.printstacktrace (); }}} 7. 파일 업로드의 성능 향상
FileItem 컬렉션을 받으라는 요청을 구문 분석 할 때 다음을 사용합니다.
FileItemiterator it = up.getItemiterator (요청);
사용과 비교합니다
목록 <fileItem> list = up.parserequest (요청);
훨씬 더 나은 성능.
샘플 코드 :
공개 클래스 FastServlet는 httpservlet {public void dopost (httpservletrequest request, httpservletresponse 응답)를 servletexception, ioexception {request.setcharacterencoding ( "utf-8"); 문자열 path = getServletContext (). getRealPath ( "/up"); DiskFileItemFactory 디스크 = 새로운 DiskFileItemFactory (); 디스크 세트 레피 성 (새 파일 ( "d :/a")); try {servletfileupload up = new ServletfileUpload (디스크); // 다음은 반복자 모드 FileItemiterator it = up.getItemiterator (request)입니다. while (it.hasnext ()) {fileItemStream item = it.next (); 문자열 filename = item.getName (); filename = filename.substring (filename.lastindexof ( "//")+1); inputStream in = item.openstream (); fileUtils.copyInputStreamTofile (in, 새 파일 (path+"/"+filename)); }} catch (예외 e) {e.printstacktrace (); }}} 8. 파일 다운로드
얻거나 게시 할 수 있습니다.
public void dopost (httpservletrequest req, httpservletresponse resp) servletexception, ioexception {req.setcharacterencoding ( "utf-8"); 문자열 이름 = req.getParameter ( "name"); // 1 단계 : 응답 유형 설정 resp.setContentType ( "Application/Force-Download"); // 두 번째 읽기 파일 문자열 path = getServletContext (). getRealPath ( "/up/"+name); inputStream in = new FileInputStream (Path); // 응답 헤더를 설정 // USERT URL 파일 이름의 인코딩 이름 = urlencoder.encode (이름, "utf-8"); resp.SetHeader ( "내용화", "첨부 파일; filename ="+name); resp.setContentLength (in.available ()); // 3 단계 : 파일을 시작하여 outputStream out = resp.getOutputStream (); 바이트 [] B = 새로운 바이트 [1024]; int len = 0; while ((len = in.read (b))! = -1) {out.write (b, 0, len); } out.close (); 넣다(); } J2EE 인기 프레임 워크를 사용할 때프레임 워크의 내부 캡슐화를 사용하여 업로드 및 다운로드를 완료하는 것이 더 쉽습니다.
struts2가 업로드되었습니다.
개발에 struts2를 사용하는 경우, Commons-FileUpload-1.3.1.jar 패키지가 가져온 JAR 패키지에 있음을 찾기가 어렵지 않습니다. 위의 학습을 통해 이미이를 사용하여 파일을 업로드하고 다운로드 할 수 있습니다. 그러나 struts2는 추가 캡슐화를 받고 있습니다.
보다
<form action = "fileUpload.action"method = "post"encType = "multipart/form-data"> username : <input type = "text"name = "username"> <br> 파일 : <input type = "file"name = "file"> <br> <input type = "제출"제출 "> </form>
제어 장치
public class fileUploadAction actionSupport {private String username; // 파일은 프론트 엔드 JSP에서 업로드 된 파일 자체를 참조하지 않고 임시 폴더 아래에 개인 파일 파일을 저장하도록 업로드 된 파일; // 제출 된 파일의 이름 // struts는 마지막 파일의 이름을 자동으로 차단 하여이 속성 개인 문자열 파일 filename에 주입합니다. // getter and setter는 현재 공간을 저장하기 위해 저장됩니다 @override public string execute () Exection () Exception {// 업로드 된 파일 root = servletactionContext.getServletContext (). getRealPath ( "/upload"); // 임시 파일 가져 오기 입력 스트림 입력 스트림 is = new FileInputStream (파일); // output file outputStream os = 새 FileOutputStream (새 파일 (root, filefilename)); // 업로드 된 파일 시스템의 파일 이름을 인쇄합니다. // 파일은 임시 폴더에 저장된 파일이므로 파일 이름과 파일 경로를 인쇄하여 이전 파일 필레나 이름 System.out.println ( "파일 :" + file.getName ())과 동일한 지 확인할 수 있습니다. System.out.println ( "파일 :" + file.getPath ()); 바이트 [] 버퍼 = 새로운 바이트 [1024]; int 길이 = 0; while (-1! = (길이 = is.read (버퍼, 0, buffer.length))) {os.write (buffer); } os.close (); is.close (); 반환 성공; }}우선, 여기의 파일은 실제로 JSP가 업로드 한 파일을 참조하지 않음을 분명히해야합니다. 파일이 업로드되면 struts2는 먼저 struts.multipart.savedir (default.properties)에 지정된 저장 위치를 찾습니다 (기본값이 비어 있음). 프로젝트의 Struts2 에이 임시 저장소 위치를 지정할 수 있습니다.
<constant name = "struts.multipart.savedir"value = "/repository"/>
struts.multipart.savedir가 설정되지 않은 경우 javax.servlet.context.tempdir로 지정된 주소는 기본적으로 사용됩니다. javax.servlet.context.tempdir의 값은 서버에 의해 결정됩니다. 예를 들어, 내 웹 프로젝트의 컨텍스트가 ABC이고 서버가 Tomcat을 사용하는 경우 SavePath는 %tomcat_home %/work/catalina/localhost/abc_이어야합니다. 임시 파일의 이름은 UPLOAD_1A156008_1373A8615DD_8000_00000001.TMP와 유사합니다. 임시 파일 이름은 매번 다를 수 있지만이 스타일은 대략입니다. 그리고 Eclipse에서 서버를 사용하여 Tomcat 및 Start를 구성하는 경우 위의 주소의 % tomcat_home %는 시스템의 실제 Tomcat 루트 디렉토리가 아니지만 Eclipse에서 지정된 주소가됩니다. 예를 들어, 내 로컬 주소는 다음과 같습니다. /home/wang/eclipsejavacode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload_1a156008_1373737373737373737373737373737373737373730000100010001000100000100010000010000010000100000100000100000100
struts2는 다운로드가 완료되었습니다.
struts2 파일을 더 간단하게 다운로드하고 입력 스트림을 정의하고 파일을 입력 스트림에 쓰십시오. 주요 구성은 여전히 struts.xml 구성 파일에서 구성하는 것입니다.
public class filedownloadaction은 ActionSupport {// Server Private String Path에서 파일을 다운로드하는 경로를 확장합니다. // 개인 문자열을 다운로드 할 파일의 파일 이름을 다운로드 할 수 있습니다. // getter 및 setter 공개 inputStream getDownloadFile () {return servletActionContext.getServletContext (). getResourCeasStream (path); } @override public string execute ()는 예외를 던집니다. {// 현재 동작은 setDownloadFilename (xxx)입니다. 반환 성공; }}동작은 입력 스트림 다운로드 파일을 정의한 다음 getter 메소드를 제공합니다. 다음으로 struts.xml의 구성 파일을 살펴 보겠습니다.
<action name = "filedownload"> <result name = "download"type = "stream"> <param name = "contentDisPosition"> 첨부; filename = "$ {downloadfilename}"</param> <param name = "inputname"> downloadfile </param> </result> </action>struts.xml 구성 파일에주의를 기울여야 할 곳이 여러 곳이 있습니다. 첫째, 유형은 스트림 유형 _로 정의되어야하며, 이는 파일 다운로드 결과입니다. 결과 요소에는 일반적으로 매개 변수 하위 요소가 있습니다. 파일을 다운로드 할 때 매개 변수를 설정하는 데 사용됩니다. inputName 속성은 동작에서 파일 입력 스트림을 얻는 것입니다. 이름은 동작의 입력 스트림 속성과 동일해야합니다. 그런 다음 contentDisPosition 속성입니다. 이 속성은 일반적으로 다운로드 된 파일을 처리하는 방법을 지정하는 데 사용됩니다. 값이 첨부 파일 인 경우 다운로드 상자가 팝업되어 사용자가 다운로드 여부를 선택할 수 있습니다. 이 값이 설정되지 않으면 브라우저는 먼저 다운로드 된 파일을 열는지 확인합니다. 가능하다면 다운로드 된 파일을 직접 열립니다 (물론 필요한 것은 아닙니다). 다른 값은 filename입니다.이 파일 다운로드 이름은 다운로드 할 때 파일로 표시됩니다. 이 정보를 구성한 후 파일 다운로드 기능을 구현할 수 있습니다.
SpringMVC가 업로드를 완료합니다.
보기는 struts2 예와 정확히 동일합니다. 이것은 쓰여지지 않았습니다.
제어 장치:
@controller@requestmapping (value = "fileOperate") public class fileOperAteAction {@requestMapping (value = "ubload") public String upload (httpservletrequest request,@requestParam ( "file") multipartfile photofile) {// 업로드하는 경로를 read que = request.getSession (). getServletContext (). getRealPath ( "/")+"업로드"; // 원본 파일 이름 문자열 filename = photofile.getoriginalFilename (); // 파일 확장자 string extName = filename.substring (filename.lastIndexof ( ".")); // 파일 이름 충돌 방지, 이름을 약간 수정하면 filename = filename.substring (0, filename.lastindexof ( "."))) + System.NanoTime () + extName; fileUtils.writeByTearRaytofile (새 파일 (dir, filename), photofile.getBytes ()); "성공"을 반환합니다. }}SpringMVC 전체 다운로드 :
@requestmapping ( "/download") public string download (문자열 filename, httpservletrequest request, httpservletrepsonge 응답) {response.setcharacterencoding ( "utf-8"); Response.setContentType ( "multipart/form-data"); response.setHeader ( "내용화", "첨부 파일; filename =" + filename); {inputStream inputStream = 새 파일 (파일의 경로); outputStream os = response.getoutputStream (); byte [] b = new Byte [2048]; int 길이; 입력.위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.