BE전문가 프로젝트

3. 파일 업로드(Spring shop) 본문

입사 후 정리

3. 파일 업로드(Spring shop)

원호보고서 2022. 5. 2. 13:55

1. 빈을 등록한다.

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<beans:property name="maxUploadSize" value="2000000" />
</beans:bean>

 

2. html에 "multipart"를 붙여준다

<form role="form" method="post" action="/boardWrite" enctype="multipart/form-data">

 

3. Controller에서 MultipartHttpServletRequest 사용하여 request영역을 확장시켜 준다.(Service)

public int writeBoard(BoardDTO boardDTO, HttpServletRequest req) throws IOException {
		MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req; //확장 시켜주기 -> bean 등록
		// platformManager >> 이거를 씀
		// Annotation 편하게 사용 가능하지만 교육이기 때문에 platformManager사용
		TransactionStatus status = platformTransactionManager.getTransaction(new DefaultTransactionAttribute());
		List<FileDTO> fileList = new ArrayList<FileDTO>();
		
		try {
		boardDao.insertBoard(boardDTO);
		
		// 2. 파일업로드하고
		fileList = fileService.uploadFile(mr);
		if(fileList != null) {
			for (FileDTO file : fileList) {
				int board_id = boardDTO.getBi_no();
				file.setBoard_id(board_id);
				boardDao.intsertFile(file);
			}
		}
		platformTransactionManager.commit(status);//정상 작동시 실행
		}catch (Exception e) {//오류가 발생하게 된다면 메소드 실행으로 생성된 파일을 지워준다
			String path = mr.getSession().getServletContext().getRealPath("resources/file/");//상대경로 찾기
			for (FileDTO file : fileList) {
				File f = new File(path+file.getSaved_file_name());
				f.delete();
			}
			platformTransactionManager.rollback(status);//오류시 지정된 위치로 rollback
		}
		return 1;
	}

4. File을 위한 서비스를 만들어 준다.(FileService)

package com.spring.shop.commons;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Service
public class FIleService {
	
	public List<FileDTO> uploadFile(MultipartHttpServletRequest mr) throws FileNotFoundException, IOException {
		List<FileDTO> list = new ArrayList<FileDTO>();
		String path = mr.getSession().getServletContext().getRealPath("resources/file");//경로를 찾는다
		
		File saveDir = new File(path);
		if(!saveDir.exists()) {
			saveDir.mkdirs(); //디렉토리가 없으면 생성해주는 메소드
		}
		
		List<MultipartFile> fList = mr.getFiles("file");//request영역에서 file이라는 이름을 갖은 파일을 찾는다
		if (!fList.isEmpty()) {
			for (MultipartFile f : fList) {
				String name = f.getOriginalFilename();
				long size = f.getSize();
				File destination = File.createTempFile("F_" + System.currentTimeMillis(), name.substring(name.lastIndexOf(".")), saveDir);
				String fileSavedName = destination.getName();
				// 메모리에 올라와있는 파일을 실제 디스크에 저장한다.
				FileCopyUtils.copy(f.getInputStream(), new FileOutputStream(destination));
				
				FileDTO file = new FileDTO(name, fileSavedName, size);
				list.add(file);
			}
		}
		return list;
	}
}

 

6. DAO생성

public int intsertFile(FileDTO param) {
		return sqlSession.getMapper(BoardMapper.class).insertFile(param);
	}

 

7.mapper생성

	<insert id="insertFile" parameterType="FileDTO">
		insert into board_attach(
			board_type,
			board_id,
			file_num,
			file_name,
			saved_file_name,
			file_size
		)values(
			'Board',
			#{board_id},
			nextval('seq_file_num'),
			#{file_name},
			#{saved_file_name},
			#{file_size}
		)
	</insert>

'입사 후 정리' 카테고리의 다른 글

2. myBatis 쿼리문(Spring shop)  (0) 2022.05.02
입사 1일차 공부  (0) 2022.04.25
Comments