πŸ’» BackEnd/🟒 Spring | SpringBoot

🟒 [Spring] μŠ€ν”„λ§ 파일 μ—…λ‘œλ“œ

Dbswnstjd 2023. 6. 30. 17:34

μŠ€ν”„λ§

🚩 μŠ€ν”„λ§μ—μ„œ 파일 μ—…λ‘œλ“œ κ΅¬ν˜„

μŠ€ν”„λ§μ—μ„œ 파일 μ—…λ‘œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ λͺ‡ 가지 섀정을 ν•΄μ€˜μ•Όν•œλ‹€. 

commons-fileupload λ₯Ό 메이븐 라이브러리 μ˜μ‘΄μ„± 섀정을 μΆ”κ°€ν•˜κ³  μ›Ή μ»΄ν¬λ„ŒνŠΈ μ„€μ • 파일(servlet-context.xml)에 MultipartResolver 빈 섀정을 μΆ”κ°€ν•΄μ•Όν•œλ‹€. 


1. 메이븐 라이브러리 μ˜μ‘΄μ„± μ„€μ • 

<!-- File Upload  -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.4</version>
		</dependency>

버전은 μžμ‹ μ˜ ν”„λ‘œμ νŠΈμ— 맞게 μ„€μ •ν•΄μ£Όλ©΄ λœλ‹€.


2. μ›Ή μ»΄ν¬λ„ŒνŠΈ μ„€μ • 파일

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="50000000"/>
	</beans:bean>

MultipartResolver λΉˆμ„ 생성해주도둝 ν•œλ‹€. 파일의 ν¬κΈ°λŠ” λ„ˆλ¬΄ 크면 μ•ˆλ˜κΈ° λ•Œλ¬Έμ—  μ΅œλŒ“κ°’μ„ 지정해쀀닀. 

λ‚˜λŠ” bean idλ₯Ό 섀정해주지 μ•Šμ•„μ„œ form μ—μ„œ 데이터가 λ„˜μ–΄κ°€μ§€ μ•Šμ•„μ„œ μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 값을 받지 λͺ»ν•˜λŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ˜€λ‹€. 

κΌ­ xml 빈 μ„€μ • μ‹œ idλ₯Ό 지정해주도둝 ν•΄μ•Όν•œλ‹€.


πŸ“Œ JSPμ—μ„œ Form νƒœκ·Έ μ΄μš©ν•΄μ„œ Controller에 전달

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:url var="actionURL" value="/upload/new"/>
<form action="${actionURL}" method="post" enctype="multipart/form-data">
	<select name="dir">
		<option value="/">/
		<option value="/images">/이미지
	</select>
	<input type="file" name="file">
	<input type="submit" value="SAVE">
	<input type="reset" value="CANCEL">
</form>
</body>
</html>

μ—…λ‘œλ“œ ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•œ 폼이닀. 이와 같이 Viewμ—μ„œ form νƒœκ·Έ μ•ˆμ— enctype="multipart/form-data" 속성을 μΆ”κ°€ν•΄μ€€λ‹€. 


πŸ“Œ Controller

@RequestMapping(value="/upload/new", method=RequestMethod.GET)
	public String uploadFile(Model model) {
		return "upload/form";
	}
	
	@RequestMapping(value="/upload/new", method=RequestMethod.POST)
	public String uploadFile(@RequestParam(value="dir", required=false, defaultValue="/") String dir, @RequestParam MultipartFile file, RedirectAttributes redirectAttrs) {
		
		logger.info(file.getOriginalFilename());
		try {
			if(file!=null && !file.isEmpty()) {
				UploadFileVO newFile = new UploadFileVO();
				newFile.setDirectoryName(dir);
				newFile.setFileName(file.getOriginalFilename());
				newFile.setFileSize(file.getSize());
				newFile.setFileContentType(file.getContentType());
				newFile.setFileData(file.getBytes());
				uploadService.uploadFile(newFile);
			}
		}catch (Exception e) {
			logger.error(e.getMessage());
			redirectAttrs.addFlashAttribute("message", e.getMessage());
		}
		return "redirect:/upload/list";
	}

μ»¨νŠΈλ‘€λŸ¬μ—μ„œ /upload/new 둜 GET request μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ 보여쀄 λ‚΄μš©λ“€μ„ /upload/form에 λΏŒλ €μ€€λ‹€. 

그리고 μ—…λ‘œλ“œ λ²„νŠΌμ„ λˆ„λ₯΄κ²Œ 되면 form의 methodκ°€ Post이기 λ•Œλ¬Έμ— post μš”μ²­μ΄ λ“€μ–΄μ˜€κ²Œ λœλ‹€.

λ”°λΌμ„œ @RequestMapping(POST~)λ₯Ό DispatcherServlet이 μ°Ύμ•„μ„œ 맀핑해쀀닀. κ·Έ ν›„ μžμ‹ μ΄ ν•„μš”ν•œ 정보듀을 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜€λ©΄ λœλ‹€. 

그리고 μ—…λ‘œλ“œκ°€ μ™„λ£Œλ˜λ©΄ 사진 λͺ©λ‘μ΄ μžˆλŠ” 곳으둜 redirect ν•΄μ£ΌλŠ” λ‘œμ§μ„ μž‘μ„±ν•˜μ˜€λ‹€.

Service와 RepositoryλŠ” Github에 μ˜¬λ €λ‘μ—ˆκΈ° λ•Œλ¬Έμ— λ‹€μŒμ— κΈ°νšŒκ°€ λœλ‹€λ©΄ λ‘œμ§μ„ μ„€λͺ…ν•  것이닀. 


πŸ’» Github 전체 μ½”λ“œ 

https://github.com/wnstjd9701/spring-practice

 

GitHub - wnstjd9701/spring-practice: Spring Practice

Spring Practice. Contribute to wnstjd9701/spring-practice development by creating an account on GitHub.

github.com