파일 업로드 개요
웹 개발에서 파일 업로드 기능을 실현하려면 다음 두 단계를 완료해야합니다.
웹 페이지에 입력 업로드를 추가하십시오
서블릿에서 업로드 된 파일 데이터를 읽고 로컬 하드 디스크에 저장하십시오.
웹 페이지에 업로드 입력 항목을 추가하는 방법은 무엇입니까?
<input type = "file"> 태그는 파일 업로드 입력 항목을 웹 페이지에 추가하는 데 사용됩니다. 파일 업로드 입력 항목을 설정할 때주의를 기울여야합니다.
1. 입력 입력 항목의 이름 속성을 설정해야합니다. 그렇지 않으면 브라우저가 업로드 된 파일 데이터를 보내지 않습니다.
2. 형태의 ENCTEPE 값은 멀티 파트/양식 데이터로 설정해야합니다. 이 값을 설정 한 후 브라우저가 파일을 업로드 할 때 파일 데이터를 HTTP 요청 메시지 본문에 첨부하고 MIME 프로토콜을 사용하여 업로드 된 파일을 설명하여 수신기가 구문 분석하고 업로드 된 데이터를 처리 할 수 있습니다.
파일 업로드 개요
서블릿에서 파일 업로드 데이터를 읽고 로컬 하드 디스크에 저장하는 방법은 무엇입니까?
요청 객체는 클라이언트가 제출 한 데이터를 읽을 수있는 getInputStream 메소드를 제공합니다. 그러나 사용자는 동시에 여러 파일을 업로드 할 수 있으므로 서블릿 측면에서 직접 업로드 데이터를 프로그래밍 방식으로 읽고 해당 파일 데이터를 별도로 구문 분석하는 것이 매우 번거로운 작업입니다.
사용자가 파일 업로드 데이터를 처리 할 수 있도록 Apache 오픈 소스 조직은 파일 업로드를 처리하는 데 사용되는 오픈 소스 구성 요소 (Commons-Fileupload)를 제공합니다. 이 구성 요소는 우수한 성능을 가지고 있으며 API는 사용하기가 매우 간단하므로 개발자는 웹 파일 업로드 기능을 쉽게 구현할 수 있습니다. 따라서 파일 업로드 기능은 일반적으로 웹 개발에서 구현되며, 일반적으로 Commons-FileUpload 구성 요소를 사용하여 구현됩니다.
Commons-FileUpload 구성 요소를 사용하여 파일 업로드를 구현 하고이 구성 요소의 해당 지원 JAR 패키지를 가져와야합니다 : Commons-FileUpload 및 Commons-IO. Commons-IO는 파일 업로드 구성 요소의 개발 JAR 파일에 속하지 않지만 Commons-FileUpload 구성 요소는 버전 1.1로 시작하여 작동 할 때 Commons-IO 패키지의 지원이 필요합니다.
FileUpload 구성 요소 워크 플로
코어 API- 디스크 파일 팩토리
DiskFileItemFactory는 FileItem 객체를 만드는 공장입니다. 이 공장 수업을위한 일반적인 방법 :
public void setsizethreshold (int sizethreshold) : 메모리 버퍼의 크기를 설정하고 기본값은 10K입니다. 업로드 파일이 버퍼 크기보다 크면 FileUpload 구성 요소가 임시 파일 캐시를 사용하여 파일을 업로드합니다.
public void setRepository (java.io.file repository) : 임시 파일 디렉토리를 지정하면 기본값은 system.getProperty ( "java.io.tmpdir")입니다.
public diskfileitemfactory (int sizethreshold, java.io.file 저장소) : 생성자
Core API -ServletfileUpload
ServletFileUpload는 업로드 된 파일 데이터를 처리하고 양식의 각 입력 항목을 파일 시티 객체로 캡슐화합니다. 일반적인 방법은 다음과 같습니다.
부울 ismultipartContent (httpservletrequest 요청) : 업로드 된 양식이 멀티 파트/폼 데이터 유형인지 결정
list parserequest (httpservletrequest request) : 요청 객체를 구문 분석하고 양식의 각 입력 항목을 FileItem 객체로 감고 모든 FileItems를 저장하는 목록 수집을 반환합니다.
setfilesizemax (long filesizemax) : 업로드 된 파일의 최대 값을 설정합니다
setsizemax (long sizemax) : 업로드 된 파일 총 총 값을 설정
SetheaderEncoding (java.lang.string encoding) : 인코딩 형식을 설정합니다
SetProgressListener (ProgressListener Plistener)
파일 업로드 케이스
구현 단계
1. 디스크 파일 팩토리 객체를 만들고 버퍼 크기와 임시 파일 디렉토리를 설정하십시오. 2. 디스크 파일 팩토리 객체를 사용하여 ServletFileUpload 객체를 작성하고 파일 업로드를위한 크기 제한을 설정하십시오.
3. Servletfileupload.parserequest 메서드를 호출하여 요청 객체를 구문 분석하고 업로드 된 모든 내용을 저장하는 목록 개체를 얻습니다.
4. 목록을 반복하십시오. 각각은 fileItem 객체를 반복하고 isformfield 메소드를 호출하여 업로드 된 파일인지 여부를 결정합니다.
정상적인 형태 필드입니다. 그런 다음 getfieldName 및 GetString 메서드를 호출하여 필드 이름과 필드 값을 얻습니다.
파일을 업로드하기 위해 GetInputStream 메소드가 호출되어 데이터 입력 스트림을 얻으려면 업로드 된 데이터를 읽습니다.
파일 업로드를 구현하기위한 인코딩
파일 업로드의 세부 정보 처리
중국 파일은 문제가되었습니다
Barlyed Chinese 파일 이름의 문제, Servletuploader의 SetheaderEncoding 방법을 호출하거나 요청의 SetCharacterEncoding 속성을 설정할 수 있습니다.
임시 파일 삭제 문제
파일 크기는 diskfileitemfactory.setsizethreshold 메소드에 의해 설정된 메모리 버퍼의 크기를 초과하기 때문에 Commons-FileUpload 구성 요소는 임시 파일을 사용하여 업로드 된 데이터를 저장합니다. 따라서 프로그램이 끝나면 FileItem.Delete 메서드를 호출하여 임시 파일을 삭제하십시오.
삭제 방법에 대한 호출은 스트림이 닫힌 후에야합니다. 그렇지 않으면 파일 사용이 발생하여 삭제 실패가 발생합니다.
파일 저장 위치
서버의 보안을 보장하기 위해 업로드 된 파일을 응용 프로그램의 웹 -INF 디렉토리 또는 웹 서버에서 관리하지 않는 디렉토리에 저장해야합니다.
여러 사용자가 파일 이름이 동일한 파일을 업로드하지 못하도록 파일 덮어 쓰기가 발생하기 위해 파일 업로더에 업로드 된 파일에 고유 한 파일 이름이 있는지 확인해야합니다.
단일 디렉토리의 파일을 너무 많이 방지하고 파일 읽기 및 쓰기 속도에 영향을 미치려면 파일 업로드를 처리하는 프로그램은 가능한 총 파일 업로드의 총량을 기반으로 적절한 디렉토리 구조 생성 알고리즘을 선택하고 업로드 된 파일을 산란 된 방식으로 저장해야합니다.
파일 다운로드
다운로드 할 파일은 다양한 유형 일 수 있으므로 파일을 클라이언트로 전송해야하며 해당 콘텐츠를 바이너리로 처리해야하므로 파일 콘텐츠를 클라이언트에 작성하려면 ServelToutPutStream 객체를 반환하도록 메소드를 호출해야합니다.
케이스를 다운로드하십시오
업로드 디렉토리의 모든 파일을 반복하고 사용자에게 표시하고 사용자가 다운로드를 완료 할 수 있습니다.
(특정 폴더의 모든 파일을 읽고 컬렉션의 목록에 저장 한 다음 요청 범위로 저장) listfileservlt-(모든 파일 목록 표시) listfiles.jsp ---- downloaservlet.javaprivate String id; private string savename; // 업로드 파일의 이름, 파일 개인 문자열 실수 이름의 UUID 이름; // 업로드 파일의 실제 이름 개인 문자열 savepath; // 프라이빗 날짜 가동 시간 파일의 위치를 기억하십시오. // 파일의 업로드 시간 개인 문자열 설명; // 파일 개인 문자열 username의 설명; // 업 로더 listfileservletpackage com.hbsi.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.hashmap; import java.util.map; import javax.servletexception; javax.servlet.http.httpservlet; importjavax.servlet.http.httpervletrequest; importjavax.servlet.http.http.httpervletresponse; public class listfileservlet extnedshttpservlet {httpservledreget (httpervledrequest) 응답)은 SrowsServleTeXception, ioException {StringsavePath = this.getServletContext (). getRealPath ( "/web-inf/upload"); mapMap = new HashMap (); ListFiles (NewFile (SavePath), Map); request.setAttribute ( "map", map); request.getRequestDisPatcher ( "/listfile.jsp"). forward (요청, 응답);} privateVoid ListFiles (파일 파일, 맵 맵) {if (file.isfile ()) {stringUuidName = file.getName (); // uuid_a_1_3_3.txtstringrealname = uuidname.substring (uuidname.indexof ( "_") + 1); map.put (uuidname, realname);} else {file [] files = file.listfiles (); for (file) {map)}} dopost (httpservletrequest 요청, httpservletreponse response)는 rowservletexception, ioexception {doget (요청, 응답);}} downloadServletPackage com.hbsi.servlet; import java.io.file; import java.io.fileinputstream; import java.oio.outputtremence; import java.outputtremement; java.io.printwriter; import java.net.urlencoder; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; importjavax.servlet.http.httpservletrequest; importjavax.servlet.httpspronge; ExtendShttpservlet {publicvoid doget (httpservletrequest request, httpservletresponse responsk), ioexception {stringfilename = request.getParameter ( "filename"); filename = new String (filename.getBytes ( "iso8859-1"), "utf-8"); system.out.println (filename); stringsavepath = this.getFilesavePath (this.getRealName (filename)); filef = new 파일 (savepath + "//" + filename); if (! f.exists ()) {request.setattribute ( "message", "" ESTER "); request.getRequestDisPatcher ("/message.jsp "). forward (request, response);} response.setheader ("content-disposition ","attachment = "+ urlencoder.encode (this.getRealName (filename)),"utf-8 "); new fileinputStream (f); 바이트 [1024]; intlen = 0; outputStreamout = response.getOutputStream (); while ((len = in.read (buf)) {out.write (buf, 0, len);} in.close ();} getfilesavepath (string filename) {intdir1 = filename.hashcode () & 0) (filename.hashcode () >> 4) & 0xf; stringsavepath = this.getServletContext (). getRealPath ( "/web-inf/upload") + "//" + dir1 + "//" + dir2; retringsavePath;} publicstring getRealName (string filename) {StringRealname = filename.substring (filename.indexof ( "_") + 1); returnRealName;} publicVoid dopost (httpservletRequest request, httpservletResponse Responsk), ioexception {doget (request, response);}}.