ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - 파일 업로드 하기
    Spring 2019. 2. 23. 23:08

    스프링에서 파일 업로드 하기

    pom.xml

    먼저 pom.xml 에 dependency 를 추가합니다.
    commons-io 와 commons-fileupload 를 추가합니다.

    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>

    servlet-context.xml

    servlet-context.xml 에 파일 업로드 객체를 설정합니다.

    <!-- 파일 업로드 객체 설정 -->
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="10485760"/><!-- 10MB -->
    </beans:bean>

    id 값을 쓰실 때 대 소문자 구분을 꼭 해주세요 p가 소문자입니다.
    maxUploadSize의 크기는 마음대로 넣어주어도 되지만 꼭 계산된 값으로 넣어야 합니다.
    10 * 1024 * 1024 -> 10485760

    form

    파일 업로드를 테스트 하기 위해 간단한 jsp 파일을 만듭니다.

        <form action="${pageContext.request.contextPath }/file/upload.do" method="post" enctype="multipart/form-data">
            <label><input type="file" name="upload" /></label>
            <label><input type="file" name="upload" /></label>
            <input type="submit" value="업로드" />
        </form>

    form 태그의 enctype 속성은 multipart/form-data 로 넣어줍니다.
    하나의 input 태그로 여러 개의 파일을 전송하려면 multiple 속성을 넣어줍니다.

    <input type="file" name="upload" multiple />

    Controller

    폼에서 넘긴 값을 받아오는 간단한 컨트롤러를 만듭니다.

        @Controller
        public class FileController {
          @RequestMapping("/file/upload.do")
          public String uploadFile(MultipartFile[] upload, HttpServletRequest request) {
    
              //파일이 업로드 될 경로 설정
              String saveDir = request.getSession().getServletContext().getRealPath("/resources/upload/file");
    
              //위에서 설정한 경로의 폴더가 없을 경우 생성
              File dir = new File(saveDir);
              if(!dir.exists()) {
                  dir.mkdirs();
              }
    
              // 파일 업로드
              for(MultipartFile f : upload) {
                  if(!f.isEmpty()) {
                      // 기존 파일 이름을 받고 확장자 저장
                      String orifileName = f.getOriginalFilename();
                      String ext = orifileName.substring(orifileName.lastIndexOf("."));
    
                      // 이름 값 변경을 위한 설정
                      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmssSSS");
                      int rand = (int)(Math.random()*1000);
    
                      // 파일 이름 변경
                      String reName = sdf.format(System.currentTimeMillis()) + "_" + rand + ext;
    
                      // 파일 저장
                      try {
                          f.transferTo(new File(saveDir + "/" + reName));
                      }catch (IllegalStateException | IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
            return "uploadEnd";
        }
    }

    매개 변수의 MultipartFile 배열이 폼에서 넘어오는 파일들의 배열이다.
    파일을 하나씩 이름이 중복되지 않도록 바꿔서 저장한다.

    테스트 하기


    이미지 파일 2개를 선택했습니다.
    업로드 버튼을 누르면


    업로드 완료 창이 뜹니다.

    폴더에 파일이 잘 들어가는지 확인합니다.

    새로고침을 누르니 방금 업로드한 파일이 이름이 바뀌어서 저장된 것을 확인할 수 있습니다.

    반응형

    'Spring' 카테고리의 다른 글

    Spring - 트랜잭션 처리하기  (0) 2019.02.25
    Spring - 파일 다운로드 하기  (0) 2019.02.25
    Spring - MyBatis 설정하기  (0) 2019.02.20
    Spring - 설정하기  (0) 2019.02.20
    Spring - log4j 사용하기  (0) 2019.02.20

    댓글

Designed by Tistory.