티스토리 뷰


1. CommonsMultipartResolver 를 이용한 파일 업로드

  • CommsMultipartResolver 빈을 설정하여 파일 업로드를 처리할 수 있다.
  • MultipartFile 클래스를 이용하여 업로드한 파일 정보를 얻는다
  • JSP 파일의 Enctype 을 multipart/form-data로 설정한다
  • commons-fileupload, commons-io jar 파일이 있어야 한다.

pom.xml 확인

  • commons-fileupload, commons-io 가 있는지 확인한다.

mavenrepository.com 에서 필요한 라이브러리 파일을 검색한다.







commons-fileupload 에 coomons-io 가 연결되어 있다.



1

2

3

4

5

6

7

8

9

10

11

<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>



bbs의 bean 설정 파일인 

servlet-context.xml 에 multipartresolver bean 설정을 한다



1

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


다음은 파일 업로드를 구현하기 위해 VO(DTO) 를 약간 수정한다.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

    private String fname;

    private MultipartFile uploadFile;

    public BoardVO() {

    }

    public String getFname() {

        return fname;

    }

    public void setFname(String fname) {

        this.fname = fname;

    }

    public MultipartFile getuploadFile() {

        return uploadFile;

    }

    public void setuploadFile(MultipartFile uploadFile) {

        this.uploadFile = uploadFile;

    }























기존의 VO에서 파일 업로드를 위해 MultipartFile uploadFile 변수를 추가로 생성하고, getter / setter 를 만든다


여기서 기존에 JSP 에서 파일 업로드 input type="file" 에서 명칭인 fname 을 uploadFile 로 바꾼다. ( 그러면 ModelAttribute 에서 article MultipartFile uploadFile 변수에 저장되어 넘겨 받을 수 있다 )

JSP Form 에 enctype="multipart/form-data" 를 추가한다.


이제 폼에서 작성된 내용을 저장하는 Controll 소스 코드를 살펴본다.


	@RequestMapping("/write.ktds")
	public ModelAndView write(HttpServletRequest req,
			@ModelAttribute("article") BoardVO article)
			throws IllegalStateException, IOException {

		session = req.getSession();

		// 주의할점
		// MultipartResolver는 파일이 업로드 되지 않을 경우 null 을 리턴하는 것이 아니라
		// "" (공백) 을 티런해줌 그래서 파일업로드를 하지 않아도 NullPointerException이 발생하지 않음

		MultipartFile uploadfile = article.getuploadFile(); // 여기서는 Null

		String fname = uploadfile.getOriginalFilename(); // 여기서는 ""
		if (fname.equals("")) {
			article.setFname(null);
		} else {
			article.setFname(fname);

			// 1. FileOutputStream 사용
			// byte[] fileData = file.getBytes();
			// FileOutputStream output = new FileOutputStream("C:/images/" +
			// fileName);
			// output.write(fileData);

			// 2. transferTo 함수 사용
			uploadfile.transferTo(new File("d:/upload/" + fname));
		}

		article.setId((String) session.getAttribute("id"));

		bbsService.write(article);

		return new ModelAndView("redirect:list.ktds");
	}

@ModelAttribute("article") 을 통해 writeForm.jsp 에서 작성된 내용이 넘어온다.

article 변수에 현재 fname의 값은 null 이고 uploadFile 에 파일 정보가 넘어왔다.


먼저 getter 를 통해 uploadfile이라는 변수에 담고, 파일의 파일 명을 getOriginalFilename() 함수를 통해 받고, 현재 null 인 article의 fname 에 setter를 통해 파일 이름을 심는다.


MultipartFile 클래스의 transferTo 함수를 통해 간단하게 파일 전송을 할 수 있다.

( Inputstream 을 생성하고, 하는 과거의 처리를 하지 않을 수 있다 )



  • MultipartRequest 를 사용한 복수 파일 업로드에 대해서 더 공부 해야 한다.

  • 파일 업로드만 할 때에는 비동기 파일 업로드를 사용해야 한다. ( 더 공부하자..)


댓글