재판 : HTTPS : //blog.kuangstudy.com/index.php/archives/486/
.SpringMVC 파일 업로드 및 다운로드
준비 (1)
파일 업로드 프로젝트 개발은 springMVC 좋은 지원 파일 업로드 할 수 있습니다, 가장 일반적인 기능 중 하나이지만, 파일 업로드가 기본적으로 작동 처리 할 수 있도록 SpringMVC의 기본 컨텍스트는 MultipartResolver가 장착되어 있지 않습니다. 당신이 봄의 파일 업로드 기능을 사용하려면 맥락에서 MultipartResolver를 구성해야합니다.
원위 양식이 필요합니다 파일을 업로드하기 위해, 양식은 POST 방식으로 설정해야하며, 다중 / 폼 데이터에 enctype. 단이 경우, 브라우저는 이진 데이터로 서버에 파일을 선택하도록 사용자에게 보낼 것입니다;
폼의 속성에 enctype 상세한 설명 될 :
-
애플리케이션 / X-WWW = 폼-urlencoded를 기본적 만 양식 필드 값의 속성 값을 처리 양식 필드의 값은 URL로 인코딩이 인코딩 프로세스와 함께 형성된다.
-
다중 / 폼 데이터가이 방식으로 부호화하는 이진 데이터 스트림이 처리되어 형성되며, 파일 암호화 파일 요청 파라미터가 아닌 문자 인코딩로 패키징 될이 필드의 내용을 지정.
-
텍스트 / 일반 : "+"기호로 공백을 변환뿐만 아니라, 다른 문자 인코딩 과정을 수행하지 않는,이 방법은 양식을 통해 직접 메일을 보낼 적용 할 수 있습니다.
<form 조치 = ""에 enctype = "multipart / form-data"에있어서 = "POST"> <input 타입 = "파일"NAME = "파일"/> <input 타입 = "제출"> </ FORM>
에 enctype 멀티 파트 / 폼 데이터, 즉로 설정되면, 브라우저는 이진 스트림 데이터 처리 양식을 채택하며, 업로드 된 파일을 처리하기위한 원래의 서버 측에 HTTP 응답을 분석하는 것을 포함한다. 2003 년, 아파치 소프트웨어 재단은 곧 파일을 업로드하는 서블릿 / JSP 프로그래머 최선의 선택이 된 오픈 소스 커먼즈는 FileUpload 구성 요소를 발표했다.
-
Servlet3.0 사양은 이미 핸들 파일 업로드에 대한 방법을 제공하지만,이 요구는 서블릿 업로드에서 수행 할 수 있습니다.
-
스프링 MVC는 간단한 패키지를 제공합니다.
-
스프링 MVC 파일이 지원에 대한 직접 지원을 제공 업로드하는 것은 MultipartResolver 플러그 앤 플레이 구현입니다.
-
아파치 코 몬즈는 FileUpload 기술을 사용하여 스프링 MVC는 MultipartResolver 구현 클래스를 달성하기 위해 : CommonsMultipartResolver합니다. 따라서, == SpringMVC 파일 업로드는 == 아파치 코 몬즈는 FileUpload 구성 요소에 의존 할 필요가있다.
2. 파일이 개 코드를 업로드
단계 :
-
pom.xml 파일에 항아리 패키지 추가
-
배치 springmvc-servlet.xml
-
쓰기 첫 페이지
-
쓰기 백엔드
-
테스트
(1) 코드 :
pom.xml 파일에 항아리 패키지 추가
<! -文件上传-> <의존성> <의 groupId> 평민 - 파일 업로드 </의 groupId> <artifactId를> 평민 - 파일 업로드 </ artifactId를> <버전> 1.3.3 </ 버전> </ 의존성> <! - 서블릿 API导入高版本的-> <의존성> <의 groupId>에서 javax.servlet </의 groupId> <artifactId를>에서 javax.servlet-API </ artifactId를> <version>은 4.0.1 </ 버전> </ 의존성>
배치 springmvc-servlet.xml
<! - 파일 업로드 구성 ->
<콩 ID = "는 MultipartResolver" 클래스 = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
<! - (가) 요청 코딩 형식, JSP pageEncoding 속성을 일치해야하며, 형태, 기본-8859은 ISO 등의 내용을 읽을 수있는 권한 ->
<속성 이름 = 값 = "defaultEncoding"/> "UTF-8."
<! - 바이트 업로드 제한 크기 (= 10485760 중 10M) ->
<속성 이름 = "maxUploadSize"값 = "10485760"/>
<속성 이름 = "maxInMemorySize"값 = "40960"/>
</ 빈>
쓰기 첫 페이지
<% @ 페이지의 contentType = "text / html과; 문자셋 = UTF-8"언어 = "자바"%> <HTML> <HEAD> <TITLE> 업로드 </ TITLE> </ head> <body> <H1>方式1 </ H1> <form 조치 = "$ {} pageContext.request.contextPath / 업로드"에 enctype = "multipart / form-data"에있어서 = "POST"> <input 타입 = "파일"NAME = "파일"/> < 입력 타입 값 = = "업로드"> "제출" </ FORM> </ BODY> </ HTML>
쓰기 백엔드
가져 오기 org.springframework.web.bind.annotation.RequestMapping, 가져 오기 org.springframework.web.bind.annotation.RequestParam, 가져 오기 org.springframework.web.bind.annotation.RestController, 가져 오기 org.springframework.web.multipart.commons. CommonsMultipartFile, 가져 오기 나오는 javax.servlet.http.HttpServletRequest, 가져 오기 는 java.io * ; @RestController 공공 클래스는 FileController { // @RequestParam ( "파일") CommonsMultipartFile에 패키지 이름 = 파일을 얻을 대상 파일을 제어 할 수 @ 일괄 업로드 CommonsMultipartFile을 배열에 비해 RequestMapping @ ( "/ 업로드" ) 공개는 FileUpload 문자열 (@RequestParam ( "파일") CommonsMultipartFile 파일, HttpServletRequest의 요청) 던졌습니다 IOException가 { // 파일 이름을 얻을 : file.getOriginalFilename (); 문자열 uploadFileName = file.getOriginalFilename을 (); // 파일 이름을 직접 다시 null의 경우 홈으로! IF ( "" .equals (uploadFileName)) { 반환 "파일 이름이 NULL입니다!" ; } 에서 System.out.println ( "업로드 파일 이름 :"+ uploadFileName); // 업로드 설정 저장 경로 문자열 경로 = request.getServletContext () .getRealPath ( "/ 업로드" ); // 경로가 존재하지 않는 경우 생성 파일 realpath를 = 새로운 새로운파일 (경로); IF (! {RealPath.exists ()) realPath.mkdir (); } 에서 System.out.println ( "업로드 파일 주소 저장 :"+ realpath) 의 InputStream IS = file.getInputStream을 (); // 파일 입력 스트림 OutputStream에 OS = 새로운 새 FileOutputStream 또는 ( 새로운 새 파일 (realpath, uploadFileName을)); // 파일 출력 스트림 // 읽기 쓰기 INT LEN = 0 ; 바이트 [완충액 = 새로운 새 바이트 [1,024 ] 그동안 ((LEN = is.read (완충액)) = - 1! ) { os.write (버퍼 0 , 렌); () os.flush; } os.close (); 가까운(); 반환 "上传成功!" ; } }
이 테스트는 성공!
(1) 코드 II :
file.Transto를 사용하면 업로드 된 파일을 저장합니다
쓰기 첫 페이지
<H1>采用file.Transto来保存上传的文件</ H1> <form 조치 = "$ {} pageContext.request.contextPath / upload2"에 enctype = "multipart / form-data"에있어서 = "POST"> <input 타입 = '파일'이름 = "파일"/> <input 타입 = 값 = "업"> "제출" </ 형태>
쓰기 백엔드
/ * * 사용 file.Transto 저장하기 위해 업로드 된 파일 * / @ RequestMapping을 ( "/ upload2" ) 공공 문자열 fileUpload2 (@RequestParam ( "파일") CommonsMultipartFile 파일, HttpServletRequest의 요청) 던졌습니다 IOException가 { // 설정 저장 업로드 경로를 문자열 경로를 request.getServletContext = ()는 getRealPath ( "/ 업로드 할 수 있습니다." ); 파일 realpath = 새로운 새로운 파일 (경로); IF를 (! {realPath.exists ()) realPath.mkdir (); } // 업로드 주소 System.out에. 에 println ( "업로드 파일 주소 저장 :"+ realpath를); // 쓰기 파일을 직접 CommonsMultipartFile에 의해 (이 시간에주의) file.transferTo ( 새 파일 (realPath + "/"+ file.getOriginalFilename ())); 반환 "上传成功!" ; }
이 테스트는 성공!
3. 다운로드
다운로드 단계 :
-
첫 번째 세트에 응답하여 응답
-
파일을 읽기 -의 InputStream을
-
쓰기 파일 -의 OutputStream
-
작업을 수행
-
닫기 스트림 (첫 번째 스위치)
쓰기 첫 페이지
<a href="${pageContext.request.contextPath}/download"> 点击 下载 </a>를
쓰기 백엔드
프로젝트 디렉토리 폴더에 업로드 파일은 사진 .PNG 이미지 다운로드 얻을 수있는 코드를 포장
@ RequestMapping (값 = "/ 다운로드" ) 공공 문자열 다운로드 (HttpServletResponse를 응답, HttpServletRequest의 요청) 던졌습니다 {예외 // 사진 주소 다운로드하려면 문자열 경로 =을 request.getServletContext () getRealPath ( ". / 업로드" ) 문자열 fileName에 = "코드 이미지 .PNG" ; // . (1) 상기 제 1 응답에 응답하여 제공된다 response.reset을 (); // 페이지가 캐시되지 설정된 빈 버퍼 response.setCharacterEncoding ( "UTF-8."); // 문자 인코딩 response.setContentType를 ( " 다중 / 폼 데이터 "); // 이진 송신 데이터 // 설정 응답 헤더 response.setHeader ("콘텐츠 - 처리 ", "첨부 파일, fileName에 ="+를 URLEncoder.encode (파일 이름, "UTF-8." )); 파일 파일 = 새로운 새로운 파일 (경로, fileName에); // 이 파일 읽기 - 입력 스트림 InputStream 인의 INPUT = 새로운 새로운 합니다 (FileInputStream의를 파일) // . 3 파일 쓰기 - 출력 스트림 OutputStream에 OUT = response.getOutputStream () 의 바이트 [] = BUFF 새로운 새 바이트 [1024 ]; INT 인덱스 = 0 , // 4 행하는 기입 동작한다. 그동안을 (( ! input.read 인덱스 = (BUFF)) = -1 ) { out.write (BUFF, 0 , 인덱스) out.flush (); } out.close (); () input.close; 반환 널 (null)을 ; }
이 테스트는 성공!