[백업][가리사니] 스프링 파일 업로드
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 폴더를 만들어줍니다. 실행하면 업로드 되는 것을 확인할 수 있습니다. (심각하게 간단합니다….;;;;;;;;)

추신

당연한거지만.. 예제라서 패스를 저렇게 잡았습니다. 최종저장은 디플로이 폴더 밖에 저장해야합니다.

  • 안그러면 디플로이 할때마다 증발하기 때문이죠. 가리사니의 경우 디플로이 안의 유저가 접근하지 못하는 폴더에 임시저장하고 파일을 확인 후 (확인이라는게 예를들어 이미지 확장자면 이미지파일이 맞는지 확인) 최종 디플로이 폴더 밖에 추출한 썸네일과 함께 저장합니다.