// boardEnrollForm.jsp
<h2>게시글 작성하기</h2>
<form action="${contextPath}/board/insert/${boardCode}" id="enrollForm"
method="post" enctype="multipart/form-data">
<table align="center">
<tr>
<th>제목</th>
<td><input type="text" id="title" class="form-control" name="boardTitle" required></td>
</tr>
<tr>
<th>작성자</th>
<td>${loginUser.userId}</td>
</tr>
<tr>
<th>첨부파일</th>
<td><input type="file" id="upfile" class="form-control" name="upfile"></td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea id="content" style="resize:none;" rows="10" class="form-control"
name="boardContent" required="required"></textarea>
</td>
</tr>
</table>
<div align="center">
<button type="submit" class="btn btn-primary">등록</button>
<button type="reset" class="btn btn-danger">취소</button>
</div>
</form>
// root-context.xml
<!-- 업로드 되는 파일에 대한 설정 추가하기 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 1. 인코딩 처리 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 2. 용량 제한 처리
maxUploadSize : 한 번에 업로드되는 파일의 총 용량 설정
maxInMemorySize : (서버)디스크에 임시파일을 생성하기 전에 메모리에 보관시킬 최대 바이트 크기
-->
<property name="maxUploadSize" value="10000000" /> // 10MB로 제한
<property name="maxInMemorySize" value="10000000" />
</bean>
// spring/common/Utils.java
public class Utils {
// 파일저장함수
// -> 파일을 저장시키면서 파일명을 수정한 후 수정된 파일명을 반환해주기
public static String saveFile(MultipartFile upfile, String savePath) {
// upfile을 savePath로 이동시키기
// 랜덤파일명 생성하기
String originName = upfile.getOriginalFilename();
String currentTime = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date());
int random = (int)(Math.random() *90000 + 10000); // 10000~99999
String ext = originName.substring(originName.indexOf(".")); // '.'을 기준으로 확장자만 가져오기
String changeName = currentTime + random + ext;
try {
upfile.transferTo(new File(savePath+changeName));
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return changeName;
}
// 크로스사이트스크립트 공격을 방지하기 위한 메서드(replaceAll 함수로 변경해주기)
public static String XSSHandling(String content) {
if(content != null) {
content = content.replaceAll("&", "&");
content = content.replaceAll("<", "<");
content = content.replaceAll(">", ">");
content = content.replaceAll("\"", """);
}
return content;
}
// 개행문자 처리
// textarea -> \n, p -> <br>
public static String newLineHandling(String content) {
return content.replaceAll("(\r\n|\r|\n|\n\r)", "<br>");
}
// 개행해제 처리
public static String newLineClear(String content) {
return content.replaceAll("<br>", "\n");
}
}
@Slf4j// log찍어보기 위한 어노테이션
@Controller
@SessionAttributes({"loginUser"})
@RequestMapping("/board") // 공통주소
public class BoardController {
@GetMapping("/insert/{boardCode}") // get방식으로 insert페이지로 이동
public String enrollBoard(@PathVariable("boardCode") String boardCode) {
return "board/boardEnrollForm";
}
@PostMapping("/insert/{boardCode}")
public String insertBoard(
Board b,
@PathVariable("boardCode") String boardCode,
@ModelAttribute("loginUser") Member loginUser,
//@ModelAttribute : sessionAttribute에 의해 session으로 이관된 데이터를 매개변수에서 얻어올때 사용하는 방법
Model model, //게시글등록 실패시 errorMsg 담아줄 예쩡
HttpSession session,
MultipartFile upfile // form태그안에 input type="file"(첨부파일)
) {
// 이미지, 파일을 저장할 저장경로 얻어오기
String webPath = "/resources/images/board/"+boardCode+"/";
String serverForderPath = application.getRealPath(webPath);
// 디렉토리가 존재하지 않는다면 생성해주는 코드 추가
File dir = new File(serverForderPath);
if(!dir.exists()) {
// 존재하지 않는다면
dir.mkdirs(); // mkdirs() : 디렉토리 여러개 추가할때
}
// 사용자가 첨부파일을 등록한 경우
if(!upfile.getOriginalFilename().equals("")) {
// upfile == null 로 체크하면 안됨!
// => 첨부파일을 등록하지 않아도 무조건 객체는 생성되고 없다면 내부에 데이터가 비어있다("")
// 사용자가 전달한 파일유무는 filename 존재여부로 확인해야 한다!
String changeName = Utils.saveFile(upfile, serverForderPath);
b.setOriginName(upfile.getOriginalFilename()); //원본파일명 저장
b.setChangeName(changeName); // 등록시 변경된 파일명 저장
}
// Board객체에 나머지 데이터 추가하기(default 필드명 제외)
b.setBoardWriter(loginUser.getUserNo()+""); //number -> String으로 변경
b.setBoardCd(boardCode);
log.info("board {}", b);
int result = boardService.insertBoard(b);
String url = "";
if(result > 0) {
// 등록성공
session.setAttribute("alertMsg", "게시글 등록 성공!");
url = "redirect:/board/list/" + boardCode;
}else {
model.addAttribute("errorMsg", "게시글 작성 실패!");
url = "common/errorPage";
}
return url;
}
}