-
[ Spring ] 6. 파일 업로드 / 다운로드스타터스 백엔드 3기 2023. 1. 18. 13:02
스프링을 사용하지 않고 마이바티스만 사용했을 경우

스프링과 마이바티스를 연동한 경우
spring-mybatis에서 하는 것
- 스프링 데이터소스 설정하기
- sqlsessionfactory 설정하기 (sql-mapping, mybatis-config(alias))
- sqlsession 생성하기
- @Annotation을 사용하기 위한 component base-package 설정
여기서 생성한 세션이 @autowired를 통해 연결된다.

main()이 아니라 서버에서 실행하는 경우
초록색이 추가된 부분이다.
xml만 5개 ...
스프링 부트 가면 xml 사라진다.

파일 업로드 / 다운로드
나중에 websocket도 배운다
으 싫어 ...
application/x-www-form-urlencoded
- html form 데이터 전송하는 방법이다.
- 한 개의 String 형태로 전송된다.
- 전송데이터는 name=김뫄뫄&age=12 이런 식으로 전송된다.
- 파일을 선택해서 서버로 보낼 때도 위와 같이 보내지기에, 파일명만 보내지게 된다.
- 파일을 보낼 땐 <form enctype="multipart/form-data" method="post">로 보내자!
- <input type="file"> => 파일 선택창(windows) => 파일명 선택 => 파일명+길이+파일내용 보내진다.
- 여기까지 클라이언트가 할 일!
- 서버가 할 일
- <form action="fileupload" enctype="multipart/form-data" method="post">
- /fileupload를 받는 컨트롤러의 메소드는 Multipart 매개변수를 받아야 한다.
- 클라이언트가 올린 파일명과 같은 것을 찾아서 요소들을 하나의 파일로 만든다.
- pom.xml에 파일업로드라이브러리를 설정한다.
파일업로드 실습
1. pom.xml에 maven dependency 추가
- commons-io, commons-fileupload

2. servlet-context.xml에 설정 추가


환경설정 끝
코딩 시작(upload)
1. 폼으로 보내는 컨트롤러

2. uploadform.jsp (폼 입력)
- enctype="multipart/form-data"
- method="post"

3. 폼에서 입력시 나오는 정보
- Content-Type : multipart/form-data;

4. 파일을 받는 dto는 데이터타입이 MultipartFile여야 한다.

4. 업로드된 파일의 이름에 랜덤 문자열을 붙이고 지정된 경로에 저장하기
- 폼에서 버튼을 누르면 이 컨트롤러 메소드로 이동한다.
- 전달할 UploadDto 객체를 @ModelAttribute("dto")에 담는다.
- 저장하고 싶은 폴더는 c:\upload 폴더이다.
- 먼저 저장 경로를 저장한다 (savepath).
- getFile로 받은 것을 MultipartFile 객체에 저장한다.
- getOriginalFilename() 를 사용해서 파일명1을 추출한다.
- 여기서 주의해야 할 점이 있다. 만약 파일1.png을 두 번 업로드한다면, upload 폴더의 파일1.png은 두 번 생성되는 게 아닌 덮어써질 것이다. 따라서 파일명에 랜덤 문자열을 추가할 것이다.
- UUID.randomUUID()를 사용하자.
- . 전까지 자르고, . 이후를 자른다. 이름과 확장자로 잘린다.
- 두 개 사이에 UUID.randomUUID()를 추가한다.
- 저장경로에 만든 이름으로 새로운 File을 저장한다. c:/upload/filename1가 된다.
- getFile() 한 것을 transferTo()를 사용해 serverfile1로 변경한다.


5. 업로드된 파일 이름 꺼내기
- dto.file1.originalFilename을 사용한다.
- 그냥 dto.file1만 적으면 객체값이 나온다.




파일 다운로드
1. 컨트롤러 메소드 : upload 폴더에 저장된 파일의 배열을 만들어서 반환한다.
- /filelist를 매핑한다.
- c:/upload에 새로운 File 객체를 생성한다.
- f.list()를 filelist라는 스트링 배열에 담는다.
- 모델에 담아서 보낸다.

2. 다운로드폼.jsp를 만든다.
- filelist를 String[]으로 받는다.
- for문을 사용하여 filedownload?onefile=filename 으로 만든다.
- href를 클릭하면 filedownload가 매핑된 서블릿으로 이동한다.

3. 컨트롤러 메소드 : 다운로드 메서드를 만든다.
- c:/upload/filename의 위치와 이름을 가진 File 객체를 생성한다.
- 위 객체의 length() 를 생성한다. int로 형변환 해야 하며, response에 사용된다.
- response에 setContentType(), setContentLength(), setHeader()를 설정한다.
- OutputStream, FileInputStream를 사용해 FileCopyUtils.copy() 한다... ?
- 글고 stream들 닫아준다.

void transferTo(File dest) throws IOException, IllegalStateException;
- 받은 파일을 지정된 대상 파일로 전송합니다.
- 이것은 파일 시스템의 파일을 이동하거나, 파일 시스템의 파일을 복사하거나, 메모리 보유 콘텐츠를 대상 파일에 저장할 수 있다. 대상 파일이 이미 있으면 먼저 삭제됩니다.
- 대상 파일이 파일 시스템에서 이동된 경우 이 작업을 나중에 다시 호출할 수 없습니다. 따라서 저장 메커니즘으로 작업하려면 이 메서드를 한 번만 호출하십시오.
- 기본 제공자에 따라 임시 스토리지는 컨테이너에 따라 달라질 수 있으며 여기에 지정된 상대적 대상의 기본 디렉토리(예: Servlet 3.0 멀티파트 처리)를 포함합니다.
- 절대 대상의 경우 임시 복사본이 이미 존재하더라도 대상 파일의 이름을 임시 위치에서 변경하거나 새로 복사할 수 있습니다.
- @param 대상 파일(일반적으로 절대)
- @throws 읽기 또는 쓰기 오류의 경우 IO 예외를 발생시킵니다
- @throws 파일이 이미 파일 시스템에서 이동되어 다른 전송에 더 이상 사용할 수 없는 경우 IgalidStateException을 반환합니다
- @see org.cla.cla 참조.파일 업로드.FileItem#write
- @see javax.servlet.dll을 참조하십시오.부품 #쓰기(문자열)
'스타터스 백엔드 3기' 카테고리의 다른 글
[ 스프링부트 ] 1. STS4 환경설정 (0) 2023.01.19 [ Spring ] 7. ajax (0) 2023.01.18 [ Spring ] 6. MyBatis와 Spring 연동 (Spring MVC 방식으로 회원관리 만들기) (0) 2023.01.17 [ Spring ] 5. MyBatis (0) 2023.01.16 유데미 스타터스 취업 부트캠프 3기 - 백엔드 8주차 (0) 2023.01.13