today_is

[ spring ] FileComponent , 다중 파일업로드 본문

spring

[ spring ] FileComponent , 다중 파일업로드

ye_rang 2024. 1. 4. 09:22

오늘의 목표

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