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 |