[Spring] FileComponent

2024. 10. 9. 18:41Spring

저번 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