728x90
파일 업로드
1. pom.xml 설정
프로젝트 pom.xml에 commons-fileupload 의존성을 추가합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
...
<!-- 파일 업로드 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
...
</project>
pom.xml
2. <form>에 속성 추가
<form> 내부에 enctype="multipart/form-data"를 추가하고 input type="file"을 추가합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글작성페이지</title>
</head>
<body>
<form action="insertBoard.do" method="post" enctype="multipart/form-data">
<input type="hidden" name="writer" value="${member}">
<input type="text" name="title" required placeholder="제목 작성"> <br>
<input type="text" name="content" required placeholder="내용 작성"> <br>
<input type="file" name="fileUpload" onchange="thumnail(event);"> <br>
<input type="submit" value="글 작성">
</form>
<hr>
<div id="thumbnailBox"></div>
<hr>
<a href="main.do">메인으로 돌아가기</a>
</body>
</html>
insertBoard.jsp
3. BoardVO 멤버변수 추가
package com.spring.biz.board;
import org.springframework.web.multipart.MultipartFile;
public class BoardVO {
private int bid;
private String title;
...
private MultipartFile fileUpload;
private String fileName;
...
}
BoardVO.java
4. DispatcherServlet-servlet.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
...
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="-1" />
</bean>
...
</beans>
DispatcherServlet-servlet.xml
MutipartFile은 원시타입이 아닌 참조타입(객체)이기 때문에 new를 해야합니다. Resolver는 DispatcherServlet의 멤버변수이므로 DispatcherServlet-servlet.xml에서 설정해야 합니다.
5. Controller 로직 추가
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
...
@RequestMapping(value="/insertBoard.do", method=RequestMethod.POST)
public String insertBoard(BoardVO bVO) throws IllegalStateException, IOException {
// getter로 첨부한 파일 초기화
MultipartFile fileUpload = bVO.getFileUpload();
// 만약 첨부한 파일이 있으면
if (!fileUpload.isEmpty()) {
// 파일명 추출
String fileName = fileUpload.getOriginalFilename();
System.out.println("파일명: " + fileName);
// 복사본 파일 생성 후 디렉토리 폴더에 저장
fileUpload.transferTo(new File("D:\\PJH\\workspace_spring_20\\day69\\src\\main\\webapp\\images\\" + fileName));
}
if(boardService.insert(bVO)){
return "redirect:main.do";
}
else{
return "redirect:insertBoard.jsp";
}
}
}
BoardController.java
어플리케이션은 파일명 중복을 피하기 위해 별도의 폴더를 생성합니다. 이 폴더는 어플리케이션의 파일 저장소로 사용되며 사용자가 업로드한 파일을 별도의 폴더로 복사합니다. 이때, 파일의 고유한 이름을 생성하여 중복을 방지할 수 있습니다. 파일이 별도의 폴더에 복사된 후, 해당 폴더에 저장합니다.
GitHub
https://github.com/Qkrwnsgus0522/Spring
728x90