웹 애플리케이션 시스템의 개발에서 파일 업로드 및 다운로드 기능은 일반적으로 사용되는 기능입니다. 오늘은 Javaweb에서 파일 업로드 및 다운로드 기능의 구현에 대해 이야기 해 봅시다.
파일 업로드 개요
1. 파일 업로드의 기능
예를 들어, 네트워크 하드 드라이브! 파일을 업로드하고 다운로드하는 데 사용됩니다.
Zhilian 채용에 대한 완전한 이력서를 작성하려면 사진을 업로드해야합니다.
2. 페이지 업로드 요구 사항
파일 업로드에 대한 많은 요구 사항이 있습니다. 기억하십시오.
양식을 사용해야하며, 하이퍼 링크 양식 방법은 게시되어야합니다.
양식의 ENCTYPE는 멀티 파트/양식 데이터 여야합니다
양식에 파일 양식 필드를 추가하십시오. 즉 <input type = "file"name = "xxx"/>
<form action = "$ {pagecontext.request.contextpath}/fileUploadServlet"메서드 = "post"enctype = "multipart/form-data"> username : <input type = "텍스트"이름 = "username"/>> 파일 1 : <input type = "file"file1 : <br/> file 2 : <input type = ""파일 " 이름 = "file2"/> <br/> <입력 유형 = "제출"value = "제출"/> </form>3. 파일 업로드 양식과 일반 텍스트 양식의 차이점 비교
httpwatch를 통해 "파일 업로드 양식"과 "일반 텍스트 양식"의 차이점을보십시오.
파일 업로드 양식 = "multipart/form-data"의 enctype는 다중 부분 양식 데이터를 나타냅니다.
EncType 속성을 설정하지 않고 정상 텍스트 양식을 설정할 수 있습니다.
Method = "post"인 경우 Enctype의 기본값은 Application/x-www-form-urlencoded입니다. 즉, method = "get"을 사용하면 Enctype의 기본값이 null이므로 텍스트가 없으므로 일반 텍스트 양식을 테스트 할 필요가 없습니다.
<form action = "$ {pagecontext.request.contextPath}/fileUploadServlet"메서드 = "Post"> username : <입력 유형 = "text"name = "username"/> <br/> 파일 1 : <입력 유형 = "file" "file1"/> <br/> 파일 2 : <input type = "file" "file"/>>>>>>> " 값 = "제출"/> </form>HTTPWATCH 테스트를 통해 양식의 요청 데이터 본문을 살펴보면 요청에 파일 이름 만 있지만 파일 내용이 없음을 발견했습니다. 즉, 양식의 ENCTYPE가 멀티 파트/양식 데이터가 아닌 경우, 요청에는 파일 내용이 포함되어 있지 않지만 파일 이름 만 포함합니다. 즉, 입력 : 파일 및 입력 : 텍스트 사이에는 차이가 없음을 의미합니다.
파일 업로드 양식 테스트 :
<form action = "$ {pagecontext.request.contextpath}/fileUploadServlet"메서드 = "post"enctype = "multipart/form-data"> username : <input type = "텍스트"이름 = "username"/>> 파일 1 : <input type = "file"file1 : <br/> file 2 : <input type = ""파일 " 이름 = "file2"/> <br/> <입력 유형 = "제출"value = "제출"/> </form>HTTPWATCH 테스트를 통해 양식의 요청 데이터의 본문 부분을보고 본문 부품은 여러 구성 요소로 구성되어 있으며 각 구성 요소는 양식 필드에 해당하며 각 구성 요소에는 고유 한 헤더 정보가 있습니다. 헤더 정보 아래에는 빈 줄이 있으며 빈 선 아래에는 필드의 신체 부분이 있습니다. 여러 부품은 무작위로 생성 된 분배기로 분리됩니다.
텍스트 필드의 헤더 정보에는 하나의 헤더 정보, 즉 컨텐츠 예측 만 포함됩니다. 이 헤더 정보의 값에는 두 부분이 있습니다. 첫 번째 부분은 고정되어 있으며, 즉 양식 데이터이며, 두 번째 부분은 필드의 이름입니다. 빈 줄 뒤에는 기본 부분이 있으며 주요 부분은 텍스트 상자에 채워진 내용입니다.
파일 필드의 헤더 정보에는 컨텐츠 방향 및 컨텐츠 유형의 두 헤더가 포함되어 있습니다. 컨텐츠 공연에는 추가 파일 이름이 있으며 업로드 된 파일 이름을 지정합니다. 컨텐츠 유형은 업로드 된 파일의 유형을 지정합니다. 파일 필드의 주요 부분은 파일의 내용입니다.
업로드 파일은 모두 일반 텍스트 파일, 즉 TXT 파일이므로 httpwatch에 정상적으로 표시 할 수 있습니다. 업로드 된 파일이 exe, mp3 등이라면 HTTPWatch에 표시되는 내용은 차별화됩니다.
4. 파일을 업로드 할 때 서블릿에 대한 요구 사항
제출 된 양식이 파일 업로드 양식 인 경우 서블릿에 대한 요구 사항도 있습니다.
우선, 파일 업로드 양식의 데이터도 요청 객체에 캡슐화되어 있는지 확인해야합니다.
request.getParameter (string) 메소드는 지정된 양식 필드 문자 내용을 가져 오지만 파일 업로드 양식은 더 이상 문자 내용이 아니라 바이트 컨텐츠이므로 유효하지 않습니다.
현재 getInputStream () 요청 메소드를 사용하여 ServletInputStream 객체를 얻을 수 있습니다. 입력 스트림의 서브 클래스입니다. 이 servletinputstream 객체는 전체 형태의 신체 부분 (첫 번째 분배기에서 끝까지 시작)에 해당하며, 필요한 구문 분석 스트림의 데이터를 보여줍니다. 물론, 파싱은 매우 번거로운 일이며, 아파치는 우리에게 그것을 구문 분석 할 도구를 제공했습니다 : Commons-Fileupload
request.getInputStream () 스트림의 내용을 인쇄하고 httpwatch에서 요청 데이터를 비교하려고 시도 할 수 있습니다.
public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioException {inputStream in = request.getInputStream (); 문자열 s = ioutils.tostring (in); System.out.println (s);}-------------------------------- 7DDD3370AB2Content 방치 : Form-Data; 이름 = "사용자 이름"hello ---------------------------------- 7DDD3370AB2Content 방치 : Form-Data; 이름 = "file1"; filename = "a.txt"content-type : text/plainaa --------------------------------- 7ddd3370ab2content indisposition : form-data; 이름 = "file2"; filename = "b.txt"Content-Type : Text/PlainBBB ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commons-FileUpload
FileUpload를 사용하는 이유 :
파일 업로드에 대한 많은 요구 사항이 있습니다. 기억하십시오.
포스트 양식이어야합니다.
양식의 ENCTYPE는 멀티 파트/형태-데이터 여야합니다.
파일 양식 필드를 양식에 추가하십시오.
서블릿 요구 사항 :
더 이상 request.getParameter ()를 사용하여 양식 데이터를 얻을 수 없습니다. request.getInputStream ()을 사용하여 양식 항목의 데이터 대신 모든 양식 데이터를 가져올 수 있습니다. 즉, FileUpload를 사용하지 않으므로 request.getInputStream () 자신의 내용을 구문 분석해야합니다.
1. FileUpload 개요
FileUpload는 Apache의 Commons 구성 요소가 제공하는 업로드 구성 요소입니다. 주요 임무는 요청을 구문 분석하는 것입니다. getInputStream ()
FileUpload 구성 요소에 필요한 JAR 패키지는 다음과 같습니다.
Commons-FileUpload.jar, 핵심 패키지
Commons-Io.jar, 종속성 패키지
2. FileUpload의 간단한 적용
FileUpload의 핵심 클래스는 DiskFileItemFactory, ServletFileUpload, FileItem입니다
FileUpload 구성 요소를 사용하는 단계는 다음과 같습니다.
// 1. 팩토리 클래스 DiskFileItemFactory Object DiskFileItemFactory Factory = New DiskFileItemFactory (); // 2를 만듭니다. Factory ServletFileUpload FileUpload = New ServletFileUpload (Factory); // 3을 사용하여 파서 개체를 만듭니다. 파서를 사용하여 요청 객체 목록 <fileItem> list = fileUpload.parsEerquest (요청)를 구문 분석합니다.
DiskFileItemFactory 디스크 파일 항목 팩토리 클래스
Public DiskFileItemFactory (int sizethreshold, 파일 저장소)
공장을 구성 할 때 메모리 버퍼 크기 및 임시 파일 저장 위치를 지정하십시오.
공개 void setsizethreshold (int sizethreshold)
메모리 버퍼 크기, 기본 10K를 설정하십시오
공개 void setRepository (파일 리포지토리)
임시 파일 스토리지 위치, 기본 System.getProperty ( "java.io.tmpdir")를 설정하십시오.
메모리 버퍼 : 파일을 업로드 할 때 업로드 된 파일의 내용이 먼저 메모리 버퍼에 저장됩니다. 업로드 된 파일 크기가 버퍼 크기를 초과하면 서버 측에서 임시 파일이 생성됩니다.
임시 파일 저장 위치 : 메모리 버퍼 크기를 초과하여 파일 업로드 임시 파일을 생성합니다. FileItem의 Delete () 메소드를 통해 임시 파일을 삭제할 수 있습니다.
FileItem은 파일 업로드 양식의 데이터의 각 부분을 나타냅니다.
우리는 파일 클래스를 엄숙하게 소개 할 것입니다. 이것은 우리가 원하는 최종 결과입니다. FileItem 객체는 양식 항목 (양식 필드)에 해당합니다. 파일 필드 및 일반 필드는 형태로 존재합니다. isformfield () 파일 클래스 메소드를 사용하여 양식 필드가 정상 필드인지 확인할 수 있습니다. 일반 필드가 아닌 경우 파일 필드입니다.
참고 : 파일 업로드 양식은 기존 URL 인코딩과 다른 Multipart/Form-Data를 사용하여 인코딩되므로 모든 getParameter () 메소드는 SetCharacterEncoding ()을 사용할 수 없습니다.
ServletFileUpload 파일 업로드 핵심 클래스
3. 간단한 업로드 예제
간단한 업로드 예를 작성하십시오.
양식에는 사용자 이름 필드와 파일 필드가 포함됩니다.
Servlet은 업로드 된 파일을 업로드 디렉토리에 저장하고 사용자 이름, 파일 이름, 파일 크기, 파일 유형을 표시합니다.
첫 번째 단계 :
index.jsp를 완료하려면 하나의 양식 만 필요합니다. 양식은 게시되어야하며 ENCTYPE는 Mulitpart/Form-Data 여야합니다.
<form action = "$ {pagecontext.request.contextPath}/fileUploadServlet"메서드 = "Post"EncType = "multipart/form-data"> username : <input type = "text"name = "username"/<br/> file 1 : <input type = "file"file1 ""<br/> <input = ""제출 " 값 = "제출"/> </form>2 단계 : FileUploadServlet를 완료하십시오
public void dopost (httpservletrequest 요청, httpservletreponse response)는 servletexception, ioexception {// 인코딩 응답을 설정하려면 {/html; charset = utf-8 "); // 공장 생성 공장 DiskFileItemFactory DFIF = New DiskFileItemFactory (); // Factory ServletFileUpload FileUpload = New ServletFileUpload (DFIF)를 사용하여 파서 개체 생성; 시도 {// 파서 개체를 사용하여 요청을 구문 분석하고 파일리스트 목록 <fileItem> list = fileUpload.parsErequest (요청)를 가져옵니다. // (fileItem fileItem : list)에 대한 모든 양식 항목을 가로 지르십시오 {// 현재 양식 항목이 일반 양식 항목 인 경우 (fileItem.isformfield ()) {// 현재 양식의 필드 이름을 가져옵니다. fieldName = fileItem.getFieldName (); // 현재 양식 항목의 필드 이름이 username if (fieldName.equals ( "username")) 인 경우 {// 현재 양식 항목의 내용을 인쇄합니다. }} else {// 현재 양식 항목이 일반 양식 항목이 아닌 경우 파일 필드 문자열 이름 = fileItem.getName (); // 업로드 된 파일의 이름을 가져옵니다. // 업로드 된 파일 이름이 비어 있으면 업로드되지 않은 파일 없음 (name == null || name.isempty ()) {계속; } // $ {project directory}/uploads에 해당하는 실제 경로를 가져옵니다. 물론,이 디렉토리는 string savepath = this.getServletContext (). getRealPath ( "/uploads")가 있어야합니다. // 업로드 디렉토리 및 파일 이름 파일을 통해 파일 객체를 만듭니다. 파일 = 새 파일 (savepath, name); // 업로드 파일을 지정된 위치 파일에 저장 (파일); // 업로드 파일의 이름 인쇄 파일 응답 .getWriter (). print ( "파일 이름 업로드 :" + name + "<br/>"); // 업로드 파일의 크기를 인쇄합니다. 응답. getWriter (). print ( "파일 크기 업로드 :" + fileItem.getSize () + "<br/>"); // 업로드 된 파일 유형을 인쇄합니다. getWriter (). print ( "파일 유형 업로드 :" + fileitem.getContentType () + "<br/>"); }}} catch (예외 e) {throw new servletexception (e); }}파일 업로드 세부 정보
1. 업로드 된 파일을 웹 -INF 디렉토리에 넣습니다
사용자가 업로드 한 파일이 Web-Inf 디렉토리에 저장되지 않으면 브라우저를 통해 업로드 된 파일에 직접 액세스 할 수 있습니다.
사용자가 A.JSP 파일을 업로드 한 다음 사용자가 브라우저를 통해 A.JSP 파일에 액세스하면 A.JSP의 컨텐츠가 실행됩니다. a.jsp에 다음과 같은 진술이있는 경우 : runtime.getRuntime (). exec ( "shutdown st 1"); 그럼 당신은 ...
일반적으로 Web-Inf 디렉토리에 업로드 디렉토리를 만들어 업로드 된 파일을 저장합니다. Servlet 에서이 디렉토리를 찾으려면 ServletContext의 getRealPath (String) 메소드를 사용해야합니다. 예를 들어, 업로드 1 프로젝트에는 다음과 같은 진술이 있습니다.
ServletContext servletcontext = this.getServletContext (); String savepath = servletcontext.getRealPath ( "/web-inf/uploads");
SavePath는 다음과 같습니다. f :/tomcat6_1/webapps/upload1/web-inf/uploads입니다.
2. 파일 이름 (전체 경로, 파일 이름)
업로드 된 파일 이름은 전체 경로 일 수 있습니다.
IE6에서 얻은 파일 이름은 전체 경로이며 다른 브라우저에서 얻은 업로드 파일 이름은 파일 이름입니다. 우리는 여전히 브라우저 차이 문제를 처리해야합니다.
문자열 이름 = file1fileitem.getName (); response.getWriter (). print (name);
다른 브라우저를 사용하여 테스트하기 위해 IE6은 파일을 업로드하기 위해 전체 경로를 반환합니다. IE6이 무엇을하는지 모르겠습니다.이 문제를 해결하는 데 많은 문제가 발생합니다.
이 문제를 다루는 것도 매우 간단합니다. 그것이 완전한 경로이든 아니든, 우리는 마지막 "/"이후에 내용을 가로 채립니다.
문자열 이름 = file1fileitem.getname (); int lastIndex = name.lastIndexof ( "//"); // 마지막 "/"if (lastIndex! = -1)의 위치를 가져옵니다. {// 전체 경로가 아닌 경우 "/"가 없을 것입니다. name = name.substring (lastIndex + 1); // 파일을 가져옵니다.3. 중국인 문제
업로드 된 파일 이름에는 중국어가 포함됩니다.
업로드 된 이름에 중국어가 포함되면 인코딩을 설정해야합니다. Commons-FileUpload 구성 요소는 인코딩을 설정하는 두 가지 방법을 제공합니다.
request.setcharacterencoding (string) :이 메소드는 우리가 가장 친숙한 방식입니다.
FileUpload.SetHeaderEncdoing (String) :이 메소드는 이전 방법보다 우선 순위가 높습니다.
업로드 된 파일의 파일 내용에는 중국어가 포함됩니다.
일반적으로 업로드 된 파일을 하드 드라이브에 저장하기 때문에 파일 업로드의 내용에 신경 쓰지 않아도됩니다! 다시 말해, 파일의 모습과 서버에서 어떻게 보이는지!
그러나 그러한 요구 사항이 있고 콘솔에 업로드 된 파일 내용을 표시 해야하는 경우 FileItem.getString ( "UTF-8")을 사용하여 인코딩을 처리 할 수 있습니다.
텍스트 파일 내용 및 일반 양식 항목 컨텐츠 사용 FileItem 클래스의 GetString ( "UTF-8")을 사용하여 인코딩을 처리합니다.
4. 동일한 이름으로 파일 업로드 문제 (파일 변경)
일반적으로 사용자가 업로드 한 파일을 업로드 디렉토리에 저장하지만 사용자가 동일한 이름으로 파일을 업로드하면 어떻게해야합니까? 이로 인해 적용 범위가 발생합니다. 이 문제를 다루는 방법은 UUID를 사용하여 고유 한 이름을 생성 한 다음 "_"를 사용하여 파일로 업로드 된 원본 이름을 연결하는 것입니다.
예를 들어, 사용자가 업로드 한 파일은 "My One Inch Photo.jpg"입니다. 처리 후 파일 이름은 다음과 같습니다. 이 메소드는 파일이 확장을 잃지 않습니다. UUID의 독창성으로 인해 업로드 된 파일의 이름은 동일한 이름을 가지지 만 서버 측에서 같은 이름에는 아무런 문제가 없습니다.
public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {request.setcharacterencoding ( "utf-8"); DiskFileItemFactory DFIF = New DiskFileItemFactory (); servletfileUpload fileUpload = 새로운 servletfileUpload (dfif); {list <fileitem> list = fileUpload.parsEerequest (요청); // 첫 번째 양식 항목은 사용자 이름이기 때문에 두 번째 양식 항목을 가져옵니다. 두 번째는 파일 양식 item fileItem = list.get (1)입니다. 문자열 이름 = fileItem.getName (); // 파일 이름 가져 오기 // 클라이언트가 ie6을 사용하는 경우 전체 경로에서 파일 이름을 가져와야합니다 int lastIndex = name.lastIndexof ( "//"); if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // 업로드 된 파일을 가져옵니다. savepath = this.getServletContext (). getRealPath ( "/web-inf/ubloads"); String UUID = commentUls.uuid (); // UUID String filename = uuid + "_" + name; // 새 파일 이름은 uuid + extscore + ordiginal name // 파일 객체를 만듭니다. 그리고 업로드 된 파일은이 파일에 의해 지정된 경로에 저장됩니다. // 파일을 저장 item.write (파일); } catch (예외 E) {Throw New ServleTeXception (e); }}5. 디렉토리는 너무 많은 파일을 저장할 수 없습니다 (헤어질 디렉토리)
디렉토리에 저장된 파일이 너무 많지 않아야합니다. 일반적으로 1,000 개의 파일이 디렉토리에 저장되며, 많은 경우 디렉토리를 열 때 매우 "균열"됩니다. C :/Windows/System32 디렉토리 인쇄를 시도 할 수 있습니다.
즉, 업로드 된 파일을 다른 디렉토리에 넣어야합니다. 그러나 업로드 된 각 파일에는 하나의 디렉토리를 사용할 수 없습니다.이 방법은 너무 많은 디렉토리로 이어질 수 있습니다. 따라서 알고리즘을 사용하여 "헤어지기"해야합니다!
날짜를 사용하여 헤어지고 매일 디렉토리를 생성하는 등 여러 가지 방법이 있습니다. 파일 이름의 첫 번째 문자를 사용하여 디렉토리를 생성 할 수 있으며 동일한 초기 문자가있는 파일은 동일한 디렉토리에 배치됩니다.
날짜 중단 알고리즘 : 특정 날에 업로드 된 파일이 너무 많으면 디렉토리 파일도 너무 많습니다.
첫 번째 문자를 깨기위한 알고리즘 : 파일 이름이 중국어 인 경우 중국어가 너무 많아서 너무 많은 디렉토리로 이어질 것입니다.
여기에서 해시 알고리즘을 사용하여 분해합니다.
파일 이름의 해시 코드 가져 오기 : int hcode = name.hashcode ()
4 비트의 하위 비트를 가져온 다음 16 진 문자로 변환하여 5 ~ 8 비트의 Hcode를 가져온 다음 16 진 문자로 변환 하여이 두 16 진 문자를 사용하여 디렉토리 체인을 생성하십시오. 예를 들어, 낮은 4 비트 문자는 "5"입니다.
이 알고리즘의 장점은 업로드 디렉토리에서 최대 16 개의 디렉토리가 생성되며 각 디렉토리, 즉 256 개의 디렉토리에서 최대 16 개의 디렉토리가 생성되며 업로드 된 모든 파일은이 256 개의 디렉토리에 배치된다는 것입니다. 각 디렉토리의 최대 수가 1000 파일 인 경우 총 256,000 파일을 저장할 수 있습니다.
예를 들어, 파일 이름 업로드 이름은 다음과 같습니다. new Text Document.txt, 그런 다음 "새 텍스트 문서.txt"의 해시 코드를 얻은 다음 해시 코드의 4 자리 숫자와 5 ~ 8 자리를 얻습니다. 더 낮은 4 비트가 9, 5 ~ 8 비트 인 경우 파일 저장 경로는 업로드/9/1/입니다.
int hcode = name.hashcode (); // 파일 이름의 해시 코드를 가져옵니다. // hcode의 낮은 4 비트를 가져 와서 16 진수 문자열 string dir1 = integer.tohexstring (hcode & 0xf)으로 변환합니다. hcode의 낮은 5 ~ 8 비트를 가져 와서 hexadecimal string (hcode string)으로 변환합니다. & 0xf); // 파일을 전체 경로에 연결하십시오. SavePath + "/" + dir1 + "/" + dir2; //이 경로가 존재하지 않을 수 있으므로 파일 객체로 만들고 파일 파일 (savepath)을 저장하기 전에 디렉토리가 이미 존재하는지 확인하기 위해 디렉토리 체인을 작성하십시오.
6. 개별 업로드 된 파일의 크기 제한
업로드 된 파일의 크기를 제한하는 것은 매우 간단합니다. 매개 변수는 업로드 된 파일의 상한 수입니다. 예를 들어, servletfileupload.setfilesizemax (1024*10)는 상한이 10kb임을 의미합니다.
업로드 된 파일이 상한을 초과하면 fileUploadbase.filesizelimiteXeceedException 예외가 발생합니다. 서블릿 에서이 예외를 얻을 수 있으며 "업로드 된 파일 초과 제한을 초과"합니다.
public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {request.setcharacterencoding ( "utf-8"); DiskFileItemFactory DFIF = New DiskFileItemFactory (); servletfileUpload fileUpload = 새로운 servletfileUpload (dfif); // 업로드 된 단일 파일의 상한을 10kb fileUpload.setfilesizemax (1024 * 10)로 설정합니다. {list <fileitem> list = fileUpload.parsEerequest (요청); // 첫 번째 양식 항목이 사용자 이름이기 때문에 두 번째 양식 항목을 가져옵니다. 두 번째는 파일 양식 항목 파일 = list.get (1)입니다. 문자열 이름 = fileItem.getName (); // 파일 이름 가져 오기 // 클라이언트가 ie6을 사용하는 경우 전체 경로에서 파일 이름을 가져와야합니다 int lastIndex = name.lastIndexof ( "//"); if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // 업로드 된 파일을 가져옵니다. savepath = this.getServletContext (). getRealPath ( "/web-inf/ubloads"); String uuid = commonutils.uuid (); // uuid string filename = uuid + "_" + name; // 새 파일 이름은 uuid + endercore + ordiginal name int hcode = name.hashcode (); // hcode의 하위 4 비트를 가져옵니다. integer.tohexstring (hcode & 0xf); // 하위 5 ~ 8 비트의 hcode를 가져 와서 16 진수 문자열로 변환하십시오. String dir2 = integer.tohexstring (hcode >>> 4 & 0xf); // 파일을 전체 경로에 연결하여 SavePath + "/" + Dir1 + "/" + dir2; //이 경로가 존재하지 않을 수 있으므로 파일 객체를 작성한 다음 파일 새 파일을 저장하기 전에 디렉토리가 이미 존재하는지 확인하기 위해 디렉토리 체인을 만듭니다. // 파일 객체를 생성하면 업로드 된 파일 이이 파일에 지정된 경로에 저장됩니다. // fileItem.write (파일) 저장; } catch (예외 e) {// 제외 예외 유형이 fileUploadbase.filesizelimiteXeceedException인지 결정하십시오. 그렇다면 파일을 업로드 할 때 제한이 초과되었음을 의미합니다. if (e instanceof fileUploadBase.filesizelimiteXeceedEdException) {// 요청 요청에 오류 메시지를 저장합니다. // index.jsp 페이지로 전달하십시오! index.jsp 페이지에서 $ {msg}를 사용하려면 오류 메시지 요청을 표시해야합니다. 반품; } 새로운 servletexception (e) 던지기; }}7. 파일 업로드의 총 크기 제한
파일을 업로드하는 양식을 사용하면 여러 파일을 업로드 할 수 있습니다.
때로는 요청 크기를 제한해야합니다. 즉,이 요청에 대한 최대 바이트 수 (모든 양식 항목의 합)입니다! 이 기능을 구현하는 것도 매우 간단합니다. servletfileupload 클래스의 setsizemax (long) 메소드 만 호출하면됩니다.
예를 들어, fileUpload.setsizemax (1024 * 10); 전체 요청의 상한은 10KB입니다. 요청 크기가 10kb를 초과하면 servletfileupload 클래스의 parserequest () 메소드는 fileUploadbase.sizelimitexeceedException 예외를 던집니다.
8. 캐시 크기 및 임시 디렉토리
Blu-ray 영화를 업로드하고 영화를 먼저 메모리에 저장 한 다음 메모리를 통해 서버 하드 디스크에 복사 한 다음 메모리를 먹을 수 있습니까?
따라서 FileUpload 구성 요소는 메모리에 모든 파일을 저장할 수 없습니다. FileUpload는 파일 크기가 10kb를 초과하는지 여부를 결정합니다. 그렇다면 파일을 하드 디스크에 저장하십시오. 초과하지 않으면 메모리에 저장하십시오.
10KB는 fileUpload의 기본값입니다.
파일이 하드 디스크에 저장되면 FileUpload는 파일을 시스템 임시 디렉토리에 저장합니다. 물론 임시 디렉토리를 설정할 수도 있습니다
public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {request.setcharacterencoding ( "utf-8"); DiskFileItemFactory DFIF = New DiskFileItemFactory (1024*20, 새 파일 ( "F : // temp")); servletfileUpload fileUpload = 새로운 servletfileUpload (dfif); {list <fileitem> list = fileUpload.parsEerequest (요청); fileItem fileItem = list.get (1); 문자열 이름 = fileItem.getName (); String savepath = this.getServletContext (). getRealPath ( "/web-inf/uploads"); // fileItem.write (path (path (savepath, name));} catch (예외 e) {strash new servletexception (e);}} 개인 파일 경로 (String savepath, string filename) {// 전체 경로에서 파일 이름을 얻습니다. int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int ( "//") {filename! filename.substring (lastindex + 1); DIR2; // 새 파일 생성 (savepath).파일 다운로드
1. 서블릿을 통해 1 다운로드
다운로드 된 리소스는 Web-INF 디렉토리에 배치해야합니다 (사용자가 브라우저를 통해 직접 액세스 할 수없는 한 괜찮습니다). 그런 다음 서블릿을 통해 다운로드합니다.
JSP 페이지에서 하이퍼 링크를 제공하고 다운로드 서비스에 링크 한 다음 파일 이름을 제공하여 다운로드하십시오. 그런 다음 DownloadServlet은 파일의 실제 경로를 가져 와서 파일을 response.getOutputStream () stream에 씁니다.
다운로드 .jsp
<body> 이것은 내 JSP 페이지입니다. <br> <a href = "<c : url value = '/downloadservlet? path = a.avi'//>"> a.aavi </a> <br/> <a href = "<c : url value = '/downloadservlet? path = a.jpg'//>"> a.jpg </a> <br/> <c : urf = " value = '/downloadservlet? path = a.txt'///> "> a.txt </a> <br/> </body>
DownloadServlet.java
public void doget (httpservletrequest request, httpservletreponse response) servletexception, ioexception {string filename = request.getParameter ( "path"); 문자열 filepath = this.getServletContext (). getRealPath ( "/web-inf/uploads/" + filename); 파일 = 새 파일 (filepath); if (! file.exists ()) {response.getWriter (). print ( "다운로드하려는 파일은 존재하지 않습니다!"); 반품; } ioutils.copy (new FileInputStream (file), response.getOutputStream ());}위의 코드에는 다음과 같은 문제가 있습니다.
1. A.AVI를 다운로드 할 수 있지만 다운로드 상자의 파일 이름은 다운로드 서비스입니다.
2. A.JPG 및 A.TXT를 다운로드 할 수는 없지만 페이지에 표시하십시오.
2. 서블릿을 통해 2를 다운로드하십시오
다운로드 상자에 올바른 파일 이름을 표시 할 수 있도록 이전 예제의 문제를 처리하고 A.JPG 및 A.TXT 파일을 다운로드 할 수 있습니다.
내용화 헤더를 추가하여 위의 문제를 처리하십시오. Content-Disposition 헤더가 설정되면 브라우저가 다운로드 상자를 나타냅니다.
또한 Content-Disposition 헤더를 통해 다운로드 된 파일의 이름을 지정할 수도 있습니다!
문자열 filename = request.getParameter ( "path"); 문자열 filepath = this.getServletContext (). getRealPath ( "/web-inf/uploads/" + filename); 파일 = 새 파일 (filepath); if (! file.exists ()) {response.getWriter (). print ( "다운로드하려는 파일은 존재하지 않습니다!"); 반품; } response.addheader ( "Content-Disposition", "첨부 파일; filename =" + filename); ioutils.copy (new FileInputStream (file), response.getOutputStream ());위의 코드는 이미 TXT 및 JPG와 같은 파일 다운로드를 처리 할 수 있지만 다운로드 된 파일 이름이 중국어 인 경우 다운로드 상자에 파일 이름을 표시하는 문제를 처리 할 수 있지만 여전히 할 수 없습니다.
3. 서블릿을 통해 3 다운로드
아래는 다운로드 상자에서 중국의 디스플레이를 처리하는 문제입니다!
실제로이 질문은 매우 간단합니다. URL을 통해 중국어 만 인코딩하면됩니다!
다운로드 .jsp
<a href = "<c : url value = '/downloadservlet? path =이 킬러는 너무 차갑지 않습니다 .avi'//>">이 킬러는 너무 차갑지 않습니다 .avi </a> <br/> <a href = "<c : url value = '/downloadservlet? path = baibing.jpg'/>"> baibg.jpg </abg </abing. href = "<c : url value = '/downloadservlet? path = description.txt'/>"> description.txt </a> <br/>
DownloadServlet.java
String filename = request.getParameter ( "Path"); // GET 요청에서 중국 매개 변수에는 중국어가 포함되어 있으며 직접 변환해야합니다. // 물론 "글로벌 인코딩 필터"를 사용하는 경우 여기에서 파일 이름 = new String (filename.getBytes ( "iso-8859-1")), "UTF-8"); String FilePath = this.getServletContext (). getRealPath ( "/web-inf/uploads/" + filename); file (filepath); if (! file.exists ()) {response.getWriter (). print ( "다운로드하려는 파일이 존재하지 않습니다!"); Return;} // 모든 브라우저는 로컬 인코딩을 사용합니다. 즉, 중국 운영 체제는 GBK // 브라우저 가이 파일 이름을 수신 한 후 ISO-8859-1을 사용하여 filename = new String ( "gbk"), "iso-8859-1"); "컨텐츠. filename); ioutils.copy (new FileInputStream (file), response.getOutputStream ());위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.