1. pom.xml 에 commons-fileupload, commons-io 추가
1
2
3
4
5
6
7
8
9
10
11
|
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version> <!-- Dec, 2018 -->
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version> <!-- Sep, 2020 -->
</dependency>
|
cs |
2. web.xml 에 CommonsMultipartResolver 선언
1
2
3
4
5
6
|
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- max upload size in bytes Default(-1) -1 is unlimited -->
<beans:property name="maxUploadSize" value="5242880" /> <!-- 5MB -->
<!-- max size of file in memory (in bytes) -->
<beans:property name="maxInMemorySize" value="1048576" /> <!-- 1MB -->
</beans:bean>
|
cs |
3. security-context.xml 에 로그인한 회원만 업로드 가능하도록 필터 추가
1
|
<security:intercept-url pattern="/upload" access="hasRole('ROLE_MEMBER')"/>
|
cs |
4. view 페이지 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta id="csrf" name="_csrf" content="${_csrf.token}" />
<meta id="csrf_header" name="_csrf_header" content="${_csrf.headerName}" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="/resources/rich/image/favicon.png" />
<title>withIT</title>
<script defer src="/resources/rich/js/rich.js"></script>
</head>
<body>
<form method="post" enctype="multipart/form-data"
action="/uploadFile?${_csrf.parameterName}=${_csrf.token}"> <input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }">
<input id="myFiles" name="myFiles" type="file" multiple />
<input id="myPath" name="myPath" type="hidden" value="C://" />
<button type="button" onclick="upload()"></button>
</form>
<script>
function upload(){
let form = new FormData(document.forms[0]);
let url = "/uploadFile";
let options = myOptionsNotJSON(form);
console.log(options);
fetch(url, options)
.then(res=>res.text())
.then(text=>console.log(text));
}
</script>
</body>
</html>
|
cs |
5. controller 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//파일 업로드 submit
@PostMapping(path="/uploadFile", produces="application/text;charset=UTF-8")
@ResponseBody
public String uploadFile(MultipartHttpServletRequest mtfRequest, Principal principal) {
System.out.println("업로드 진입");
List<MultipartFile> fileList = mtfRequest.getFiles("myFiles");
String src = mtfRequest.getParameter("myPath");
System.out.println(principal.getName());
System.out.println("fileList : " + fileList.size());
System.out.println("myPath value : " + src);
for (MultipartFile mf : fileList) { //파일들을 담은 리스트를 돌면서 transferTo 메소드로 파일을 저장한다
String target = mf.getOriginalFilename(); // 원본 파일 명
Double fileSize = (double) mf.getSize()/(1024.0*1024.0); // 파일 사이즈
//확장자 앞의 .을 기준으로 잘라서 파일명과 확장자를 자른다.
//경로 + 아이디 + 시간 + 파일명 + 확장자로 파일명을 재설정
String safeFile = src + principal.getName() + "_" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + "_" + target.substring(0, target.lastIndexOf(".")) + target.substring(target.lastIndexOf("."));
System.out.println("originFileName : " + target);
System.out.println("fileSize : " + String.format("%.2f" + "MB", fileSize));
System.out.println("safeFile : " +safeFile);
try {
mf.transferTo(new File(safeFile));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return "통신완료";
}
|
cs |
5MB이하 파일을 다중 선택해 업로드 가능하며
C드라이브에 아이디+시간+파일명+확장자로 저장된다.
다만 EC2의 용량이 아주 제한적이어서 실제 배포할때 파일 저장하는 곳은
FTP로 연결되는 외부 저장소를 사용할 수밖에 없을 듯 하다.
추후 FTP연결을 구축하게 되면, FTP에 파일을 저장하고 RDS에 경로를 같이 저장하는 식으로 구현해야 할 듯 하다.
우선은 FTP연결하여 그곳에 저장하는 것을 구현해야겠다.
'Java & Spring' 카테고리의 다른 글
Head First Design Pattern - 1. 전략 패턴 (0) | 2021.01.24 |
---|---|
Spring MVC 프로퍼티 파일 value 가져오기 (0) | 2020.09.29 |
스프링 크롤링+스케쥴링 (0) | 2020.08.10 |
Spring MVC ajax input output 구현시험 (0) | 2020.08.10 |
Spring Async 스프링 비동기 수행 (0) | 2020.08.07 |