수업 내용/Spring
(62일차) 1월 19일
효자로 캉테
2022. 1. 19. 20:28
[파일 업로드]
파일첨부 코드 작성 (writeContentPage.jsp)
<!-- 파일 전송일 때 : enctype="multipart/form-data" 꼭 설정해야 함, method는 항상 post 방식이여야 함 -->
<form action="./writeContentProcess" method="post" enctype="multipart/form-data">
<input type="file" accept="image/*" multiple name="uploadFiles"><br>
<input type="submit" value="작성완료">
</form>
파일첨부 코드 작성 (BoardController)
@RequestMapping("writeContentProcess")
public String writeContentProcess(BoardVo param , MultipartFile [] uploadFiles , HttpSession session) {
ArrayList<BoardImageVo> boardImageVoList = new ArrayList<BoardImageVo>();
String uploadFolder = "C:/uploadFolder/";
// 파일 업로드
if(uploadFiles != null) {
for(MultipartFile uploadFile : uploadFiles) {
if(uploadFile.isEmpty()) { // 파일 업로드를 안해도 for문 한바퀴는 돌으므로 파일이 비어있는 경우에 탈출시키는 코드
continue;
}
// 날짜별 폴더 생성 ex) 2022/02/16/
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/"); // 날짜를 문자로, 문자를 날짜로
String folderPath = sdf.format(today);
File todayFolder = new File(uploadFolder + folderPath);
if(!todayFolder.exists()) {
todayFolder.mkdirs();
}
// 파일명을 중복되지 않게 저장해야 된다!!
// 방법 : 랜덤 + 시간
String fileName = "";
UUID uuid = UUID.randomUUID();
fileName += uuid.toString();
long currentTime = System.currentTimeMillis();
fileName += "_" + currentTime;
// 확장자 추가
String originalFileName = uploadFile.getOriginalFilename();
String ext = originalFileName.substring(originalFileName.lastIndexOf("."));
fileName += ext;
try {
uploadFile.transferTo(new File(uploadFolder + folderPath + fileName)); // transferTo 메소드는 서버쪽 컴퓨터에 업로드한 파일을 저장
} catch(Exception e) {
e.printStackTrace();
}
// 위 이미지 생성 반복문 돌 때 마다 BoardImageVo에 세팅하여 boardImageVoList에 삽입 => Service에 보냄
BoardImageVo boardImageVo = new BoardImageVo();
boardImageVo.setImage_url(folderPath + fileName);
boardImageVo.setImage_original_filename(originalFileName);
boardImageVoList.add(boardImageVo);
}
}
/* 파라미터 2개 값(title, content) + 세션에서 회원 번호 뽑아서 param 메모리에 세팅해서 3개 값 세팅 */
MemberVo sessionUser = (MemberVo) session.getAttribute("sessionUser"); /* MemberController => loginProcess에서 session.setAttribute("sessionUser", sessionUser) */
int memberNo = sessionUser.getMember_no();
param.setMember_no(memberNo); /* 세션에서 회원 번호 뽑아서 param 변수에 세팅. 즉 param에는 3개 값 세팅됨 */
boardService.writeContent(param, boardImageVoList);
return "redirect:./mainPage";
}
파일첨부 코드 작성 (BoardService)
public void writeContent(BoardVo vo, ArrayList<BoardImageVo> boardImageVoList) {
int boardNo = boardSQLMapper.createBoardPk();
vo.setBoard_no(boardNo);
boardSQLMapper.insertBoard(vo);
for(BoardImageVo boardImageVo : boardImageVoList) {
boardImageVo.setBoard_no(boardNo);
boardSQLMapper.insertImage(boardImageVo);
}
}
/* getBoard 메소드는 글보기 할 때 사용 */
public HashMap<String, Object> getBoard(int board_no, boolean isEscape) { /* 리턴 타입이 ArrayList가 아니라 HashMap인 이유는 하나의 글의 boardVo와 MemberVo만 필요하므로*/
BoardVo boardVo = boardSQLMapper.getBoardByNo(board_no);
int memberNo = boardVo.getMember_no();
MemberVo memberVo = memberSQLMapper.getMemberByNo(memberNo);
// 게시글 번호로 이미지 리스트 가져와서 map에 주입
ArrayList<BoardImageVo> boardImageVoList = boardSQLMapper.getImageListByBoardNo(board_no);
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("memberVo", memberVo);
map.put("boardVo", boardVo);
map.put("boardImageVoList", boardImageVoList);
return map;
}
파일첨부 코드 작성 (JSP)
// 게시판 글읽기 이미지 화면
<c:forEach items="${data.boardImageVoList}" var="boardImageVo">
<img src="/upload/${boardImageVo.image_url }"><br>
</c:forEach>
라이브러리 추가 (pom.xml)
<!-- 업로드용 파일 파서... -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
파일 업로드 관련 빈(bean) 추가 (servlet-context.xml)
<!-- ja: 파일 업로드 관련 추가 빈 -->
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="100000000"></beans:property>
</beans:bean>
파일 업로드 관련 서버 설정
1. server.xml 코드 추가
<Context docBase="C:\uploadFolder" path="/upload" reloadable="false"/></Host>
2. Web Modules 설정
절대경로와 상대경로
BoardImageVo (com.ja.finalproject.vo 폴더)