티스토리 뷰

SpringBoot

[JSP] File Upload/Download 구현하기

얀타호수 2023. 5. 23. 14:05

안녕하세요.

 

오늘은 JSP에서 파일 업로드와 다운로드를 구현해보겠습니다.

순서를 말씀드리겠습니다.

0) 준비사항

1) 업로드 폼 구현

2) 업로드 방식 구현

3) 다운로드 방식 구현

4) 결과물 확인

 

 

0. 준비사항 - cos.jar 

우선 파일전송에 필요한 cos.jar 라이브러리를 사용해야합니다.

이는 서블릿 홈페이지(http://www.servlets.com/cos/)에서 직접 다운받으시는게 가장 좋습니다.

하지만 저도 첨부하여 해놓을게요! 같이 사용합시다 ! 

 

cos.jar
0.05MB

위 첨부해놓은 라이브러리를 WAS가 읽을 수 있는 위치에 있어야하는데요.

보통은 [프로젝트 경로]/ROOT/webapps/ROOT/WEB-INF/lib 에 라이브러리가 위치하니 경로에 넣어줍니다.

 

-rw-r--r-- 1 tomcat tomcat   57115  4월 27 12:57 cos.jar

그리고 권한도 함께 변경해줍니다!

자 이제 준비사항은 마무리됐습니다!! 

 

 

1. 업로드 폼 구현

사실 거창한 폼은 필요가 없지만 필요한 속성들은 있습니다.

form 태그안에 'enctype="multipart/form-data' 라는 attribute를 부여해줘야합니다.

그리고 enctype은 method=POST 에서만 동작하기 때문에 GET방식에서는 파일전송이 불가합니다.

간략히 구현된 코드 참고 해주세요! :)

<form action="..." method="POST" enctype="multipart/form-data">
	<input type="file" name="attachment" id="attachmentFile" multiple>
</form>

 

 

2. 업로드 방식 구현

구현하기 위해서는 파일이 어디에 저장될 것인지를 정해야합니다.

이는 웹서비스 접근 경로가 아닌 물리적인 경로를 적어줘야해요.

저는 윈도우즈서버가 아닌 리눅스 서버에서 작업하기 때문에 작업경로가 다를 수 있다는 점 각자 확인!

String realPath = "/opt/tomcat/latest/webapps";

그리고 파일의 최대 용량을 지정해야합니다.

int maxSize = 1024 * 1024 * 10; // KB * MB * GB

이는 파일 업로드시 프론트단에서 용량체크를 한 번 더 해주면 좋을 것 같네요?

 

자, 이제 본격적으로 MultipartRequest 객체를 생성해봅시다. 아래에 파라미터 역할을 한 번 알아보죵..

MultipartRequest multi = new MultipartRequest(request,
                                            realPath,
                                            maxSize,
                                            "utf-8",
                                            new DefaultFileRenamePolicy());
1 request form태그에서 가져온 인자를 얻기위한 request 객체 전달
2 realpath 업로드 될 파일의 위치 / 위에서 정의
3 maxSize 파일 업로드 최대 용량의 크기 / 최대 용량을 넘을 경우 exception 발생
4 utf-8 한글 이름이 넘어올 경우 문제가 되지 않게 incoding 지정
5 new DefaultFileRenamePolicy() 같은 파일을 업로드할 경우 중복되지 않게 파일 이름을 변환해주는 기능

아래 코드를 통해 file로 입력한 값들을 다 가지고 옵니다.

Enumeration<?> files = multi.getFileNames();

if (files.hasMoreElements()) { // = rs.next()
			
	element = (String)files.nextElement(); // file을 반환
			
	filesystemName 			= multi.getFilesystemName(element); // 서버에 업로드된 파일명을 반환
	originalFileName 		= multi.getOriginalFileName(element); // 사용자가 업로드한 파일명을 반환
	contentType 			= multi.getContentType(element);	// 업로드된 파일의 타입을 반환 
	length 					= multi.getFile(element).length(); // 파일의 크기를 반환 (long타입)
			
}