Spring-JSP

[Spring-JSP] 파일업로드 처리 / 파일(단,다중) + 추가정보 @ModelAttribute

Jeong Jeon
반응형

파일업로드를 구현할때가 굉장히 많을 것이다.

하지만 여러가지 상황으로 파일하나만 올리는지, 파일과 추가정보를 같이 보내는지, 여러파일을 올리는지에 따라 사용법이 다르기 때문에 정리해 놓으려고 한다.

 

  1. 단일 파일 업로드
  2. 다중 파일 업로드
  3. 파일업로드 + 추가정보  => @RequestParam => 개별로 (파일&추가정보)
  4. 파일업로드 + 추가정보  => @ModelAttribute => 한번에 클래스 매핑

 

보통 스프링에서 파일업로드를 사용할때 두가지 방식 중 하나를 선택해서 사용한다.

  1. Servlet 3.0 Multipart Request 사용
  2. Apache Commons FileUpload API 사용

 

나는 Commons Fileupload를 사용해서 정리를 해놓을 예정이다.

 

1). Dependency추가

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3</version>
</dependency>

2). Servlet-context.xml => Bean정의 파일 설정

    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="1000000000"/>
        <beans:property name="maxUploadSizePerFile" value="1000000000"/>
        <beans:property name="maxInMemorySize" value="500000000"/>
    </beans:bean>

 

나머지는 사용

 

form 태그의 enctype 속성은 multipart/form-data로 세팅하여 브라우져가 파일 업로드 방식으로 동작하도록 설정합니다.

 

enctype 속성 값 목록

설명

multipart/form-data

파일 업로드시 사용 (인코딩 하지 않음)

application/x-www-form/urlencoded

디폴트값으로 모든 문자를 인코딩

text/plain

공백은 + 기호로 변환함. 특수문자는 인코딩하지 안함

우선 나는 4번 파일업로드 + 추가정보를 @ModelAttribute로 사용해보려고한다. (이유는 개별변수로 저장하게 되면 입력데이터가 많을 시 관리하기가 귀찮아지는 단점이있어서 자동매핑을 사용해보려고 한다)

 

3). Vo 만들기

Vo를 나눠 파일과 추가정보를 각각 보기좋게 사용하였다.

//1번 메인(추가정보들)
public class MainVo{
	private String name;
    private String age;
    private ArrayList<FileVo> fileList;
}

//2번 파일(파일관련 정보들)
public class FileVO {
   private String fileName;
   private MultipartFile mediaFile;
}

4). Controller에서 파일 및 추가정보 받기

@ModelAttribute를 사용하면 이름을 설정해준 Vo에 getter,setter 메서드를 통해 Spring에서 자동 매핑시켜 담아준다.

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String fileUploadWith(@ModelAttribute MainVo mainVo) throws IOException {
  //......나머지 코드
}

위처럼 MainVo로 받아버리면, 파일의 갯수가 많을때는 fileList 변수에 자동 매핑 되어 담기게 되고, 나머지 추가 정보는 알아서 변수에 담기게 되어 깔끔하게 사용할 수 있다.

반응형