Spring File 업로드 및 다운로드
Last updated
Last updated
Multipart란 파일업로드시 사용하는 enctype으로 , 하나의 요청에 대해 데이터를 전달하기 위한 공간을 여러개의 파트로 나눈 후 나눈 공간에 각 각의 데이터를 저장하여 요청을 보내는 기법이다.
Multipart는 전달할 수 있는 데이터 타입에 File과 같은 바이너리 데이터를 저장하여 요청을 보낼 수 있어서 파일 업로드시 사용된다.
스프링의 매개변수 자동 데이터 바인딩 기능은 Multipart방식으로 들어온 요청에 대한 바인딩처리는 기본설정으로 지원하지 않는다.
스프링은 위와 같은 multipart방식의 요청을 처리하기 위한 클래스로 MultipartResolver라는 인터페이스를 제공하고 있으며 수업에서는 해당 인터페이스를 구현한 다양한 의존성 중 보편적으로 많이 사용되는 CommonsMultipartResolver 의존성을 통해 파일 업로드 기능을 구현할 것이다
CommonsMultipartResolver사용을 위한 구현체 추가
multipartResolver 빈 객체추가
dispatcherServlet은 클라이언트의 요청이 multipart/form-data
인 경우 MultipartResolver를 통해 요청 내용을 파싱한다.
파싱은 HttpServletRequest객체를 MultipartRequest객체로 변환시키는 과정을 의미하며 MultipartRequest는 HttpServletRequest을 상속받아 파일 업로드에 대한 기능만 추가한 클래스이다.
파싱과정이 완료되면 서버는 전달받은 파일객체를 메모리에 임시 보관해 두었다가@RequestParam(value="upfile" , required = false ) MultipartFile upfile
에 보관중인 파일객체를 전달해준다. (MultipartFile은 http통신으로 전송된 파일을 처리하기위한 객체로 다양한 메서드를 가지고 있다)
파일저장은 메모리에 4번과정에서 얻어온 MultipartFile 객체를 통해서 진행될 것이며 , 저장시키기 위해서는 저장하고자하는 디렉토리 경로와 저장할 파일명이 추가로 필요하다.
디렉토리 경로는 정해진 규칙에 따라 작성하면 될것이다. EX) 게시판의 이미지를 저장하는 URL -> 프로젝트경로/resources/images/게시판/
저장할 파일명은 디렉토리 내에서 겹치지 않는 고유한 이름이 들어갈 수 있도록반드시 변경해줘야 한다. (하나의 디렉토리에 동일한 이름으로 파일이 들어가게 된다면 에러가 발생하기 때문)
String getName()
파라미터로 전달된 이름
String getOriginalFilename()
업로드 되는 파일의 이름
boolean isEmpty()
파일이 존재하는지 여부
long getSize()
업로드되는 파일의 크기
byte[] getBytes()
byte[]로 파일 데이터 반환
inputStream getInputStream()
파일데이터와 연결된 inputStream을 반환
transferTo(File file)
파일저장
서버의 파일시스템상에 첨부파일이 잘 등록 되었다면 핵심 업무로직에 맞춰서 비지니스 로직을 구상하면 된다. 보편적으로는 저장된 데이터를 관리하기 위해 db에 값을 기록해둘 것이다.
클라이언트가 File Down요청을 보낸다
요청을 처리할 컨트롤러의 Handler(메서드)는 클라이언트의 요청시 전달한 데이터를 바탕으로 어플리케이션에서 적절한 file을 load한다.
load한 파일을 클라이언트에게 출력스트림을 이용하여 직접 응답한다.
위 처리 흐름에서 주목할 점은 클라이언트에게 File을 직접 응답하는 부분이다. Spring Mvc 프로젝트는 View Resolver가 클라이언트의 응답화면 처리를 담당하는데 이를 무시하고 클라이언트에게 바로 파일을 전달하는게 포인트이다.
클라이언트가 요청한 파일을 검색