[Spring] 파일 업로드 설정하기

    파일 업로드 설정하기

     

     

    목차

     

      MultipartHttpServletRequest

    Spring에서 파일을 업로드, 사진을 등록하기 위해서 작업 과정에는 반드시 MultipartHttpServletRequest가 필요합니다.

    기존 HttpServletRequest보다 좀 더 상위 호환?이라고 쉽게 이해하시면 되는데요.

     

    기존 request값을 담고 있으면서, input의 file 또한 담아서 파일을 공유할 수 있게 됩니다.

     

     

     

      사용하기 위해 필요한 조치

    1. pom.xml 리포지토리 설정.

    2. DispatcherServlet에 Multipart 설정하기

    3. enctype를 multipart로 설정하기

    4. Controller에서 MultipartHttpServletRequest 사용하기

     

    위의 3가지를 숙지 하셨다면, 사용하기에는 크게 문제는 없습니다.

     

     

    1. pom.xml 설정

    <dependency>
    	<groupId>commons-fileupload</groupId>
    	<artifactId>commons-fileupload</artifactId>
    	<version>1.3.3</version>
    </dependency>
    
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.0</version>
    </dependency>

    pom.xml의 설정입니다. 버전에 대해서는 다를 수 있으니, 참고하시길 바랍니다.

     

     

    2. Dispatcher-servlet.xml 설정하기

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
    		<property name="maxUploadSize" value="10000000" />
    		<property name="maxInMemorySize" value="10485760" />
    </bean>
    Property 설명
    maxUploadSize 최대 업로드 가능한 바이트 크기 ( '-1'은 제한 없음)
    maxInMemorysize 임시 파일을 생성하기 전에 메모리에 보관할 수 있는 최대 바이트 크기
    defaultEncoding 요청을 파싱할 때 사용할 인코딩

    property 설정은 추가 및 삭제하셔도 상관없습니다.  또한 value값 또한 자유입니다.

     

     

    3. enctype 설정하기

    <form id="dataForm" method="post" enctype="multipart/form-data">
    	<input type="text" id="test" name="test" value="test" />
    	<input type="file" id="filet" name="filet" />
    </form>

    form에 잘 보신다면, enctype가 추가된 것을 확인할 수 있습니다.

    기본적인 request값을 보내는 text 타입 뿐만 아니라, 바이너리 데이터 데이터를 동시에 보내기 위함입니다.

    이때, 각각 보내는 방식이 아닌 여러가지타입의 데이터를 한 번에 전송할 수 있게 하는 multipart/form-data가 필요하게 됩니다.

     

    이에 따라서, file을 전송시에는 enctype를 반드시 작성해야 한다는 것을 잊어서는 안 됩니다.

     

     

    4. MultipartHttpServletRequest 사용하기

    @RequestMapping(value="/user/multipartabc.do", method= {RequestMethod.POST})
    public String multipartabc(MultipartHttpServletRequest req, MultipartFile file) {
    		
    		System.out.println("abc");
    		System.out.println("test");
    		
    		return "shooting/service/check_detail";
    }

    이제 form의 Event를 활용하여 Spring의 Controller에 값이 정상적으로 넘어갔다면 끝.

    정상적으로 값을 Controller에 보내지는 것을 확인할 수 있게 됩니다.

     

     

     

      Multipart 함수명

    메소드 설명
    getName() 파일의 이름을 구한다
    getOriginalFilename() 업로드한 파일의 실제이름을 구한다.
    isEmpty() 존재여부를 확인한다.(존재하지 않은 경우 true)
    getSize() 업로드한 파일의 크기를 구한다.
    getBytes() 업로드한 파일 데이터를 구한다.(byte[]로 리턴)
    getInputStream() inputStream을 구한다.
    transferTo(File dest) 업로드 한 파일 데이터를 지정한 파일에 저장한다.

     

     

     

      Ajax(비동기)에서 multipart 사용하기

    $.ajax({
      url : url,
      type : "POST",
      enctype : "multipart/form-data",
      data : formData,
      processData: false, // 필수 
      contentType: false, // 필수 
      success : function(data) {
      }
    })

     기본적으로 form을 이용해서 할 경우와 비동기의 대표적인 ajax 하고의 차이가 있습니다.

    ajax의 enctype에 'multipart/form-data'를 추가해줘야 한다는 점입니다.

     

    그리고 data 타입은 object타입을 받지 않습니다.

    만약 object 타입을 사용할 경우 MultipartHttpServletRequest의 사용이 되지 않으므로 404 Error나 500 Error가 발생 시에는 이에 대해 한 번 더 확인하시는 것을 추천드립니다.

     

     

     

      마무리

     본 필자는 object 타입을 하다가 사용이 되지 않아 매우 당황했습니다.

    안 되는 원인은 모르겠고, 설정도 이상하지 않다고 생각했지만 formData를 사용하지 않았다는 점에서 문제가 발생되었습니다.

     

    반응형

    댓글

    Designed by JB FACTORY