[Spring] FileComponent
2024. 10. 9. 18:41ㆍSpring
저번 HashComponent에 이어, FileComponent를 이용하여 다중 파일 업로드를 구현 해보자.
FileComponent
유의할 점
@component 어노테이션 붙이고 나서 이 클래스에 s 가 붙는지 꼭 확인하자
-> 스프링빈으로 등록되었는지 확인
saveDirectory 지정해두기
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class FileComponent {
private String saveDirectory = "C:\\upload";
public FileComponent() {
File f = new File(saveDirectory);
if(f.exists() == false) {
f.mkdirs();
}
}
public String upload(MultipartFile f) {
String originalFileName = f.getOriginalFilename();
String storedFileName = UUID.randomUUID().toString().replace("-", "");
String ext = originalFileName.substring(originalFileName.lastIndexOf("."));
storedFileName += ext;
File dest = new File(saveDirectory, storedFileName);
try {
f.transferTo(dest);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return storedFileName;
}
}
Ex04Controller
중첩 커맨드 객체
form 에서 같은 name 을 가지는 input 이 여러개 넘어올때,
dto(= 커맨트 객체) 내부에 필드가 List 타입이라면
같은 이름의 여러값을 리스트 형태로 자동으로 받는다.
이러한 형식을 중첩 커맨드 객체라고 한다.
중첩 커맨드 객체는 checkbox 를 List<String> 으로 받을 때도 사용할 수 있다.
단, dto 없이 (== 커맨드 객체를 사용하지 않고) 매개변수에 List를 지정하면 처리할 수 없다.
요청 처리가 완료되고 나면 redirect 를 이용하여 ex04.jsp로 보냄.
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import com.itbank.model.Upload2DTO;
import com.itbank.service.Ex04Service;
@Controller
@RequestMapping("/ex04")
public class Ex04Controller {
@Autowired private Ex04Service service;
@GetMapping
public void ex04() {}
@PostMapping
public String ex04(Upload2DTO dto) {
List<MultipartFile> list = dto.getUpload(); // 중첩 커맨드 객체
System.out.println("파일의 개수 : " + list.size());
System.out.println("각 파일의 이름");
System.out.println("===================================");
list.forEach(f -> System.out.println(f.getOriginalFilename()));
System.out.println("===================================");
int row = service.uploadMultiple(dto);
System.out.println("등록된 레코드 개수 : " + row);
return "redirect:/ex04";
}
}
Ex04Service
원본 파일명과 저장할 파일명을 다르게 구분하고 set(저장)
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.itbank.component.FileComponent;
import com.itbank.model.Upload2DTO;
import com.itbank.repository.Ex04DAO;
@Service
public class Ex04Service {
@Autowired private FileComponent fc;
@Autowired private Ex04DAO dao;
public int uploadMultiple(Upload2DTO dto) {
int row = 0;
List<MultipartFile> list = dto.getUpload();
String result = "";
String ori = "";
for(MultipartFile f : list) {
ori += f.getOriginalFilename() + " : ";
result += fc.upload(f) + " : ";
}
ori = ori.substring(0, ori.length() - 1);
// 마지막 콜론 없애기
result = result.substring(0, result.length() - 1);
dto.setOriginalFileName(ori);
dto.setStoredFileName(result);
row = dao.insertMultiple(dto);
return row;
}
}
Upload2DTO
import java.sql.Date;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
// upload2 테이블
// IDX NOT NULL NUMBER(38)
// MEMO NOT NULL VARCHAR2(100)
// ORIGINALFILENAME NOT NULL VARCHAR2(500)
// STOREDFILENAME NOT NULL VARCHAR2(500)
// UPLOADDATE DATE
public class Upload2DTO {
private int idx;
private String memo;
private String originalFileName;
private String storedFileName;
private Date uploadDate;
private List<MultipartFile> upload;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public String getOriginalFileName() {
return originalFileName;
}
public void setOriginalFileName(String originalFileName) {
this.originalFileName = originalFileName;
}
public String getStoredFileName() {
return storedFileName;
}
public void setStoredFileName(String storedFileName) {
this.storedFileName = storedFileName;
}
public Date getUploadDate() {
return uploadDate;
}
public void setUploadDate(Date uploadDate) {
this.uploadDate = uploadDate;
}
public List<MultipartFile> getUpload() {
return upload;
}
public void setUpload(List<MultipartFile> upload) {
this.upload = upload;
}
}
Ex04DAO
import org.apache.ibatis.annotations.Insert;
import com.itbank.model.Upload2DTO;
public interface Ex04DAO {
@Insert("insert into upload2(memo, originalFileName, storedFileName) "
+ " values(#{memo} , #{originalFileName}, #{storedFileName})")
int insertMultiple(Upload2DTO dto);
}
ex04.jsp
[ 다중 파일 업로드 ]
1) enctype 은 multipart 로 되어있으면서 2) input file 은 multiple 로 되어있어야 한다.\
<form method="POST" enctype="multipart/form-data">
<input type="file" name="upload" multiple required>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<<c:set var="cpath" value="${pageContext.request.contextPath }" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>ex04 - 다중 파일 업로드(multiple)</h1>
<hr>
<form method="POST" enctype="multipart/form-data">
<p><input type="file" name="upload" multiple required></p>
<p><input type="text" name="memo" placeholder="내용 설명"></p>
<p><input type="submit" value="업로드"></p>
</form>
</body>
</html>
스프링으로 프로젝트를 진행할 때는 스프링 빈으로 등록이 잘 되어있는지 확인을 하는 것이 중요하다.
빈 등록이 제대로 되어 있지 않다면 오류가 발생할 수 있기 때문에, 위에 작성한 내용대로 확인을 한 번씩 해보자.
'Spring' 카테고리의 다른 글
[Spring] RestController (1) | 2024.10.09 |
---|---|
[Spring] 설문 투표 및 결과 보기 (1) | 2024.10.09 |
[Spring] annotaion (1) | 2024.10.09 |
[Spring] Interceptor (1) | 2024.10.09 |
[Spring] mybatis mapper (4) | 2024.10.09 |