today_is
[ spring ] FileComponent , 다중 파일업로드 본문
오늘의 목표
FileComponent 를 이용하여, 다중 파일업로드를 해보자
FileComponent
유의할 점
@component 어노테이션 붙이고 나서 이 클래스에 s 가 붙는지 꼭 확인하자
-> 스프링빈으로 등록되었는지 확인

jsp 프로젝트때처럼 saveDirectory 지정해두기
package com.itbank.component;
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로 보냄
package com.itbank.controller;
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(저장)
package com.itbank.service;
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
package com.itbank.model;
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
package com.itbank.repository;
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>
Study_review
막혔던 부분
1) multipart/form-data 오타
2) 스프링 빈 등록 잘 됐는지 확인하기
3) DAO 쿼리문에 컬럼명 오타
오타에 유의하자
확인과 검증은 최소 3번씩하고 문제점을 빠르게 찾아나가자 !
'spring' 카테고리의 다른 글
[ spring ] RestController (0) | 2024.01.16 |
---|---|
[ spring ] 설문 및 투표 + 설문결과보기 기능 구현 (0) | 2024.01.09 |
[ spring ] 어노테이션 문법정리 (0) | 2024.01.02 |
[ spring ] Interceptor (0) | 2024.01.01 |
[ spring ] mybatis mapper 이용 (0) | 2023.12.28 |