본문 바로가기

카테고리 없음

Spring 09. 게시글 작성(일반게시판+사진첨부)

 

// 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("&", "&amp;");
			content = content.replaceAll("<", "&lt;");
			content = content.replaceAll(">", "&gt;");
			content = content.replaceAll("\"", "&quot;");
		}
		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;
	}
}