Back-end/JAVA,Spring

[JAVA Spring] 첨부파일 구현하기. MulripartResolver.

cheersHena 2018. 10. 21. 22:33
반응형

첨부파일 업로드 처리.


인코딩 타입이 Multipart인 경우 파라미터나 파일을 구하려면 전송데이터를 알맞게 처리해 주어야 한다.

스프링은 Multipart 지원기능을 제공하는데, 이 기능을 이용하면 추가적 처리 없이 Multipart형식의 파라미터와 파일정보를 쉽게 구할 수 있음.


1.  MulripartResolver 설정.

먼저 스프링 설정파일에 MultipartResolver를 등록해주어야한다. 


pom.xml

<!-- common fileupload -->

<dependency>

         <groupId>commons-fileupload</groupId>

         <artifactId>commons-fileupload</artifactId>

         <version>1.2.1</version>

</dependency>


<dependency>

         <groupId>commons-io</groupId>

         <artifactId>commons-io</artifactId>

         <version>1.4</version>

</dependency>


spring-servlet.xml

<!-- 멀티파트 리졸버 -->

<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

         <!-- 최대업로드 가능한 바이트크기 -->

         <property name="maxUploadSize" value="52428800" />


         <!-- 디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기 -->

         <!-- property name="maxInMemorySize" value="52428800" / -->


         <!-- defaultEncoding -->

         <property name="defaultEncoding" value="utf-8" />

</bean>


멀티파트 리졸버는 멀티파트 형식의 데이터가 전송괸 경우, 해당 데이터를 스프링에서 사용할 수 있도록 변환해준다.


스프링이 기본으로 제공하는 MultipartResolver는 CommmnosMultipartResolver이다. CommmnsMultipartResolver는 Commons FileUpload API를 이용해서 Multipart를 처리해준다.

CommmonsMultipartResolver를 MultipartResolver로 사용하려면 다음과 같이 빈 이름으로 "multipartResolver"를 사용해서 등록하면 된다.


@RequestParam 어노테이션 이용한 첨부파일 접근.

업로드한 파일을 전달받는 첫 번째 방법은 @RequestParam 어노테이션이 적용된 MultipartFile 타입의 파라미터를 사용하는 것이다. 예를 들어, HTML 입력폼이 다음과 같이 작성되어 있다고 해보자

<!-- custom file upload -->
<div class="fancy-file-upload fancy-file-primary">
    <i class="fa fa-upload"></i>
    <input type="file" class="form-control" name="attFiles" onchange="jQuery(this).next('input').val(this.value);" />
    <input type="text" class="form-control" placeholder="no file selected" readonly="" />
    <span class="button">Choose File</span>
</div>
<div class="fancy-file-upload fancy-file-primary">
    <i class="fa fa-upload"></i>
    <input type="file" class="form-control" name="attFiles" onchange="jQuery(this).next('input').val(this.value);" />
    <input type="text" class="form-control" placeholder="no file selected" readonly="" />
    <span class="button">Choose File</span>
</div>


위 코드에서 첨부파일은 attFiles 파라미터를 통해 전달된다.

이경우  Controller에서 @RequestParam 과 MultipartHttpServletRequest 이용해서 첨부파일 데이터를 전달받는다. 

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
.
.

@RequestMapping("/board/write.do")
    @ResponseBody
    public HashMap<String, Object> write(@RequestParam HashMap<String, Object> params,
MultipartHttpServletRequest mReq) {
      
        
        List<MultipartFile> mFiles = mReq.getFiles("attFiles");
        
        for(MultipartFile mFile : mFiles) {
            mFile.getSize()

        }


※ MultipartRequest 인터페이스의 파일 관련 주요 메서드

 메서드

설 명 

 Iterator<String> getFileNames()

 업로드 된 파일들의 이름 목록을 제공하는 Iterator를 구한다.

 MultipartFile getfile(String name)

 파라미터 이름이 name이 업로드 파일 정보를 구한다.

 List<MultipartFile> getFiles(String name)

 파라미터 이름이 name인 업로드 파일 정보 목록을 구한다.

 Map<String, MultipartFile> getFileMap()

 파라미터 이름을 키로 파라미터에 해당하는 파일 정보를 값으로 하는 Map을 구한다.



컨트롤러에서는 컨트롤 역할만 하는 것이 좋으므로 실제 파일을 저장하는 부분은 service 계층에서 처리한다. 


//2. 첨부파일 존재시 board_attach DB에 첨부파일 정보등록
if(params.get("hasFile").equals("Y")) { // 첨부파일 존재시
    for(MultipartFile mFile : mFiles) {// 갖고온파일리스트 해체
        
        if(mFile.getSize()!=0) {//파일 존재하면
            //DB 에 필요정보 추출 및 파람스에 담기.
            params.put("fileName", mFile.getOriginalFilename()); //파일명
            params.put("fileType", mFile.getContentType());// 확장자
            params.put("fileSize", mFile.getSize());// 사이즈
            
            //make Fake Name
            // UUID : 숫자+알파벳 38자 무작위 난수 만듦.
            String fakeName = UUID.randomUUID().toString().replace("-", "");
            
            params.put("fakeName", fakeName); // 가짜이름
            
            //필요정보 파람스에 담은 후 ,board_attach DB insert 쿼리날림.(*없던 boardSeq도 담겼다.)
            attFileDao.addAttFile(params);
            
            //3. DB에 정보 저장만했으니, 이제 실제파일을 지정해놓은 물리적 위치로 카피 ..
            try {
                fileUtil.copyFile(mFile, fakeName);
            } catch (IOException e) {
                
                e.printStackTrace();
            }
        }
    }
}


반응형