9.SpringMVC 파일 업로드 및 다운로드

재판 : 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. 파일이 개 코드를 업로드

단계 :

  1. pom.xml 파일에 항아리 패키지 추가

  2. 배치 springmvc-servlet.xml

  3. 쓰기 첫 페이지

  4. 쓰기 백엔드

  5. 테스트

(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. 다운로드

다운로드 단계 :

  1. 첫 번째 세트에 응답하여 응답

  2. 파일을 읽기 -의 InputStream을

  3. 쓰기 파일 -의 OutputStream

  4. 작업을 수행

  5. 닫기 스트림 (첫 번째 스위치)

쓰기 첫 페이지

<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)을 ; 
}

이 테스트는 성공!

 

추천

출처www.cnblogs.com/zhihaospace/p/12340010.html