본문 바로가기

Server Oriented/Spring

스프링 파일 업로드 MultipartFile #1/2

<form th:action="@{/aaa}" method="post" enctype="multipart/form-data"><!--/* 이후 공통인 부분 */-->

 <input type="file" name="bbb">

 <input type="submit" value="클릭">

</form>

 

// 파일이 저장되는 os 상의 경로는 application.yml 에 기술

@PostMapping("/aaa")

public String methodA(MultipartFile bbb) throws Exception{ // org.springframework.web.multipart.*

  log.info(bbb.getOriginalFilename()); // 경로명 없이 파일 이름과 파일 확장자

  log.info(bbb.getSize()); // long 바이트 사이즈. 1024 로 나누면 KB 사이즈

  log.info(bbb.getContentType()); // image/jpeg, image/gif, image/png, ...

}


- file type 외의 컨트롤들은 그대로 String 파라미터로 담을 수 있음.

파라미터를 일일이 기술하는데 번거롭지만 간단.

 

public String methodA(String p1, String p2, MultipartFile bbb) throws Exception{

...

}


- file type 외에 컨트롤이 많을 때는, MultipartFile 과 자바빈즈 등으로 파라미터를 딸 수 있다

 

public String methodA(ClassA classA, MultipartFile bbb) throws Exception{

  ...

}


- ClassA 에 MultipartFile 과 그외 Entity 들을 정의하고,

methodA 에서 ClassA 인스턴스를 한 번에 받아서 사용 가능.

이게 일반적으로 많이 쓰임.

 

class ClassA{

  ...

  @Transient // javax.persistence.*, DB 연동 X
  private MultipartFile file; // org.springframework.web.multipart.*

}

 

public String methodA(ClassA classA) throws Exception{

  ...

  MultipartFile bbb = classA.getFile()

  log.info(bbb.getOriginalFilename()); // 경로명 없이 파일 이름과 파일 확장자

  ...

}


- file type 이 여러개이고 이름이 다른 경우(한 번에 파일을 여러개 업로드. 이 때 file type 의 name 은 서로 상이),

  methodA 에 MultipartFile 파라미터를 여러개 설정(이 때도 명칭으로 매칭).

 

<input type="file" name="file1">

<input type="file" name="file2">

 

public String methodA(MultipartFile file1, MultipartFile file2) throws Exception{

  ...

}

 

또는.. ClassA 에 담아서..

class ClassA{

  ...

  @Transient // javax.persistence.*, DB 연동 X

  MultipartFile file1;

 

  @Transient // javax.persistence.*, DB 연동 X

  MultipartFile file2;

}

 

public String methodA(ClassA classA) throws Exception{

  ...

  MultipartFile file1 = classA.getFile1()

  MultipartFile file2 = classA.getFile2()

  ...

}


- file type 이 여러개이고 이름은 배열인 경우

methodA 에서 List<MultipartFile> files 와 같이 컬렉션에 담아서 사용

 

<input type="file" name="files[0]">

<input type="file" name="files[1]"><!--/* 배열 숫자 관리하기 은근 까다로움 */-->

 

public String methodA(List<MultipartFile> files) throws Exception{

  ...

  for(MultipartFile file : files){

    ...

  }

}

 

또는..

 

class ClassA{

  ...

  List<MultipartFile> files;

}

 

public String methodA(ClassA classA) throws Exception{

  ...

  List<MultipartFile> files = classA.getFiles();

  for(MultipartFile file : files){

    ...

  }

}


- file type 이 여러개이고 이름이 같은 경우.

바로 위에 설명된 배열 형태로 세팅하는 것과 다를 것이 없음.

 

<input type="file" name="files">

<input type="file" name="files"><!-- 동일한 name 으로 반복 사용, 이거 여러번 사용하기도 의외로 번거로움 -->

 

public String methodA(List<MultipartFile> files) throws Exception{

  ...

  for(MultipartFile file : files){

    ...

  }

}

 

또는..

 

class ClassA{

  ...

  List<MultipartFile> files;

}

 

public String methodA(ClassA classA) throws Exception{

  ...

  List<MultipartFile> files = classA.getFiles();

}


- file type multiple 옵션

 

<input type="file" name="files" multiple>

 

public String methodA(MultipartFile[] files) throws Exception{

  ...

  for(MultipartFile file : files){

    ...

  }

}