[백업][가리사니] 스프링 파일 업로드
http, java, spring
이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.
서론
참고 : https://spring.io/guides/gs/uploading-files/ 이번에 서블릿으로 만든 사이트를 스프링으로 바꾸면서 파일업로드도 알아보게 되었습니다.
- 옛날 서블릿은 직접 스트림 받아서 boundary 찾고 잘라서 처리해주다가 (물론 옛날에도 라이브러리는 다 있었습니다… 필자의 당시 취향이… 라이브러리가 있어도 만들어 쓰는 문제로..) Part 이후로 엄청편해졌는데…
- 스프링은 그것보다 더 편합니다…!!
설정
# 파일당 크기 제한
spring.http.multipart.max-file-size: 128KB
# 전체 요청 크기 제한
spring.http.multipart.max-request-size: 128KB
서블릿때랑 똑같습니다 : 파일당 / 전체요청 전체 요청을 약간 널널하게 잡고 자바스크립트로 파일 용량이 넘어가면 경고 해주는식으로 합니다.
html
간단하게 만듭시다…
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="/test-upload">
<div>
<input type="file" name="file" />
<input type="submit" value="Upload" />
</div>
</form>
</body>
</html>
컨트롤러
// 테스트 업로드 페이지 : GET
@RequestMapping(path = "/test-upload", method = RequestMethod.GET)
String testUploadPage()
{
return "test-upload";
}
// 업로드 처리 : POST
@RequestMapping(path = "/test-upload", method = RequestMethod.POST)
@ResponseBody
// 와 MultipartFile 보고 멀티파트를 자동으로 인식하는구나!!!
String testUpload(@RequestParam("file") MultipartFile file)
{
if (!file.isEmpty())
{
try
{
// 디플로이 기준루트에 test-upload-path 폴더를 만들어줍니다.
Files.copy(file.getInputStream(), Paths.get("test-upload-path", file.getOriginalFilename()));
return "파일업로드 성공 : " + file.getOriginalFilename();
}
catch (IOException | RuntimeException e)
{
logger.error("file upload fail", e);
return "파일업로드 실패 로그 확인요망";
}
}
else
{
return "파일이 없음";
}
}
주석의 내용처럼 디플로이 기준루트에 test-upload-path 폴더를 만들어줍니다. 실행하면 업로드 되는 것을 확인할 수 있습니다. (심각하게 간단합니다….;;;;;;;;)
추신
당연한거지만.. 예제라서 패스를 저렇게 잡았습니다. 최종저장은 디플로이 폴더 밖에 저장해야합니다.
- 안그러면 디플로이 할때마다 증발하기 때문이죠. 가리사니의 경우 디플로이 안의 유저가 접근하지 못하는 폴더에 임시저장하고 파일을 확인 후 (확인이라는게 예를들어 이미지 확장자면 이미지파일이 맞는지 확인) 최종 디플로이 폴더 밖에 추출한 썸네일과 함께 저장합니다.