2010년 7월 30일 금요일

Spring에서 파일을 포함한 Form 을 전송하고 업로드 하기


1. 먼저 form 태그에 다음의 프로퍼티를 추가한다.

 

enctype="multipart/form-data"

인코딩 타입이 Multipart 인 경우 파라미터나 업로드한 파일을 구할려면 전송 데이터를 알맞게 처리해 주어야 한다. 스프링은 Multipart 지원 기능을 제공하고 있기 때문에, 이 기능을 이용하면 추가적인 처리 없이 Multipart 형식으로 전송된 파라미터와 파일 정보를 쉽게 구할 수 있다.

 

2. MultipartResolver 설정

 

<bean id="multipartResolver"

 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

</bean>

Multipart 지원 기능을 사용하려면 먼저 MultipartResolver를 스프링 설정파일에 등록해 주어야 한다. MultipartResolever 는 Multipart 형식으로 데이터가 전송된 경우, 해당 데이터를 스프링 MVC 에서 사용할 수 있도록 변환해준다.

 

라이브러리에 다음을 추가한다.

 

commons-fileupload / commons-fileupload

commons-io            / commons-io            <- 1.4 version

 

2.1. MultipartResolver의 Property

 Property  Type  Descript
 maxUploadSize  long  최대 업로드 가능한 바이트 크기. -1 은 체한이 없음을 의미한다, Default 는 -1
 maxInMemorySize  int  디스크에 임시 파일을 생성하기 전에 메모리에 보관할 수 있는 최대 바이트 크기, 기본값은 10240 바이트이다.
 defaultEncoding  String  요청을 파싱할 때 사용할 캐릭터 인코딩. 지정하지 않을 경우 HttpServletRequest.setCharacterEncoding() 메서드로 지정한 캐릭터 셋이 사용된다. 아무 값도 없을 경우 ISO-8859-1을 사용한다.

 

 

3. Controller 에서 데이터 받아오기.

 

컨트롤러의 파라미터에 값을 받아 넣을 때 다음의 소스를 입력한다.

@RequestParam("[inputName]") MultipartFile [paramName]

 

다음은 MultipartFile 인터페이스가 제공하는 주요 메서드 이다.

 

 Method  Descript
 String    getName()  파라미터의 이름을 구한다.
 String    getOriginalFilename()  업로드 한 파일의 이름을 구한다.
 boolean isEmpty()  업로드 한 파일이 존재하지 않는 경우 true를 리턴한다.
 long      getSize()  업로드 한 파일의 크기를 구한다.
 byte[]   getBytes() throws IOException  업로드 한 파일의 데이터를 구한다.
 InputStream getInputStream() throws IOException

 업로드 한 파일 데이터를 읽어오는 InputStream을 구한다,

 InputStream의 사용이 끝나면 알맞게 종료해 주어야 한다.

 void      transferTo(File dest) throws IOException  업로드 한 파일 데이터를 지정한 파일에 저장한다.

 

if (multipartFile.isEmpty)) {

//업로드 한 파일데이터를 구하는 가장 단순한 방법은 MultipartFile.getBytes() 메서드를 이용하는 것이다. 바이트 배열을 구한 뒤에 파일이나 DB 등에 저장하면 된다.

   byte[] fileData = multipartFile.getByte();

   ...

}

 

if (multipartFile.isEmpty)) {

//업로드 한 파일 데이터를 특정 파일로 저장하고 싶다면 MultipartFile.transferTo() 메서드를 사용하는 것이 편리하다.

   File file = new File(fileName);

   multipartFile.transferto(file);

   ...

}

 

 

 

댓글 없음:

댓글 쓰기