9_ws_(파일업로드)

study/WebServer · 2020. 1. 23. 08:43

글쓰기클릭 했을 경우 insertForm 으로 이동

#BoardController에서 insertForm을 받아줌

else if(command.equals("/insertForm")) {
	path = "/WEB-INF/views/board/boardInsert.jsp";
    view = request.getRequestDispatcher(path);
    view.forward(request. response);
}

#BoardInsert.jsp

<form action="<%=request.getContextPath()%>/board/insert" method="post" 
				  enctype="multipart/form-data" role="form" onsubmit="return validate();">
// 파일업로드시 꼭 enctype 필요
// enctype="multipart/form-data" 업로드시 집합으로 모아 업로드

<div id="fileArea">
  <!-- multiple 속성 
  - input 요소 하나에 둘 이상의 값을 입력할 수 있음을 명시
  -->
  <input type="file" id="img1" 
  name="img1" onchange="LoadImg(this,1)"> 
  <!-- 바뀌엇을때 LoadImg함수실행 //this는 input태그 요소자체-->
  <input type="file" id="img2"
  name="img2" onchange="LoadImg(this,2)"> 
  <input type="file" id="img3"
  name="img3" onchange="LoadImg(this,3)"> 
  <input type="file" id="img4"
	name="img4" onchange="LoadImg(this,4)">
</div>

// 파일 이미지 넣기
// 이미지 공간을 클릭할 때 파일 첨부 창이 뜨도록 설정하는 함수
// jquery ready()함수
$(function () {
	// 파일 선택 버튼이 있는 영역을 보이지 않게함
    $("#fileArea").hide();
    
    // 이미지 영역 클릭 시 파일 첨부창 띄우기
    $("#titleImgArea").click(function(){
    	$("#img1").click(); //매개변수가없을씨 클릭해라가됨
    });
    $("#contentImgArea1").click(function(){
    	$("#img2").click();
    });
    $("#contentImgArea2").click(function(){
		$("#img3").click(); 
    });
	$("#contentImgArea3").click(function(){
		$("#img4").click(); 
	});
});

// 각각의 영역에 파일을 첨부 했을 경우 미리 보기가 가능하도록 하는 함수
function LoadImg(value, num) {
	// 파일업로드 시 업로드된 파일의 경로는
    // 해당 요소에 files라는 배열이 생성되며 저장됨
    // true, false 반환
    if(value.files && value.files[0]) {
    // 파일이 존재하고 첫번째 값이 있으냐? // 파일이 선택된 경우
    // 경로만 읽는과정(브라우저에 파일올라옴)
    	var reader = new FileReader();
        // 직접읽는과정
        reader.onload = function(e){
        // 파일을 다 읽으면 이벤트를 실행해라
        	switch(num){
            case 1 : $("#titleImg").prop("src", e.target.result); break;
            							// 이벤트가 실행된(이미지)주소 = result
            case 2 : $("#contentImg1").prop("src", e.target.result); break;
            case 3 : $("#contentImg2").prop("src", e.target.result); break;
            case 4 : $("#contentImg3").prop("src", e.target.result); break;
            
            }
        }
        // file에는 다양한 정보가 들어가있음(위치 크기등)
        // file에서 내용(Content)을 읽어옴
        // + base64 인코딩된 경로를 반환
        // base64(는 2진법을 64진법으로 변환)
        reader.readAsDataURL(value.files[0]);
    }
}     

#action="<%=request.getContextPath()%>/board/insert"로 보낸 서블릿을 받아줄 BoardController 작성

// 게시글 등록용 Controller
else if(command.equals("/insert")) {
	// form 전송 시 multipart/form-data로 전송하는 경우
    // 기존처럼 request.getParameter()를 이용하여
    // 입력값을 전달받을 수 없음.
    // -> MultipartRequest를 사용해야 함
    //		-> cos.jar 라이브러리 추가 필요
    //			( http://www.servlets.com/ ) 에서 다운받아 library폴더에 삽입
    try {
    	// cos.jar 설치 후 ServletFileUpload를 불러올수 있음
        if(ServletFileUpload.isMultipartContent(request)) {
        // 요청(request)가 multipart/form-data가 포함되어있냐?
        
        	// 1_1. 전송 파일의 용량 제한 : 10MB로 제한
            // B -> KB -> MB -> GB -> TB
            int maxSize = 1024 * 1024 * 10;
            
            // 1_2. 웹 서버 컨테이너 경로 추출
            //		-> WebContent 경로 추출
            String root = request.getSession().getServletContext().getRealPath("/");
            // root = WebContent/
            // 1_3. 업로드 된 파일이 저장될 경로 지정
            String savePath = root + "resources/uploadImages/";
            
            // 2. 파일명 변환 작업
            // 여러사람이 같은이름으로 파일올릴경우 덮어씌어져 서버에 데이터 회손이 일어남
            // + 파일명이 한글 또는 특수문자가 포함되면 서버 종류에 따라 문제가 발생할수 있어서
            
            // cos.jar -> DefaultFileRenamePolicy를 제공해 주지만
            // 나만의 파일명 규칙을 적용하기 위해서
            // 별도의 MyFileRenamePolice 작성
            
            // 3. MultipartRequest 객체 생성
            //    -> 객체가 생성되는 순간에
            //    -> request, 파일경로 지정, 최대 파일 크기 지정
            //		문자 인코딩 지정
            //	  -> * 변경된 파일명으로 지정된 경로로 파일이 저장됨
            MultipartRequest multiRequest = 
            	new MultipartRequest(request, savePath, maxSize,
                				"UTF-8", new MyFileRenamePolicy());
			
            // 4. 서버에 저장된 파일의 원래 파일명, 이전 파일명을
            // 	  DB에 전달하기 위한 ArrayList 생성
            
            // 저장된 파일(변경된 파일명)
            ArrayList<String> saveFiles = new ArrayList<String>();
            
            // 원본 파일명
            ArrayList<String> originFiles = new ArrayList<String>();
            
            // 전달된 요청(multiRequest)에서 파일 리스트 정보를 얻어와
            // 저장된 파일명, 원래 파일명 각 ArrayList에 추가함
            
            // iterator 예전 버전
            Enumeration<String> files = multiRequest.getFileNames();
            
            while(files.hasMoreElements()) {
            	// 다음 요소가 더 있냐?
                
                // 업로드된 파일은 역순으로 전달됨
                String name = files.nextElement();
                
                if(multiRequest.getFilesystemName(name) != null) {
                	// getFilesystemName(key) : rename된 파일명 얻어오기
                    saveFiles.add(multiRequest.getFilesystemName(name));
                    originFiles.add(multiRequest.getOriginalFileName(name));
                }
            }
            
            // 5. 파일 외에 나머지 게시글 입력값 얻어오기
            String boardTitle = multiRequest.getParameter("title");
            String boardContent = multiRequest.getParameter("content");
            String boardCategory = multiRequest.getParameter("category");
            // 오라클에서는 숫자만 있는 스트링이면 알아서 int로 바꿔줘서 형변환 X
            
            Board board = new Board(boardTitle, boardContent, boardCategory);
            
            // 회원 번호를 session에서 얻어옴
            // session은 request에서만 얻어올 수 있음
            Member loginMember 
				= (Member)request.getSession().getAttribute("loginMember");
                
            int boardWriter = loginMember.getMemberNo();
            
            // 6. Attachment VO를 생성한 후
            //	  Attachment들을 저장할 List를 생성하여
            //	  파일 경로, 파일 원본명, 변경된 파일명을 세팅
            
            ArrayList<Attachment> fList = new ArrayList<Attachment>();
            
            // 파일정보는 역순으로 전달되므로 ,
            // 반복문을 역으로 수행하여 원래 순서대로 저장
            for(int i = originFiles.size()-1; i>=0 i--) {
            	Attachment file = new Attachment();
                file.setFilePath(savePath);
                file.setFileOriginName(originFiles.get(i));
                file.setFileChangeName(saveFiles.get(i));
                
                // 썸네일 이미지는 fileLevel 0으로
                // 나머지 이미지에는 fileLevel 1로부여
                if( (i == originFiles.size()-1)
                	&& multiRequest.getFilesystemName("img1") != null) {
                    	// rename된경우는 파일이 있는 경우
                    file.setFileLevel(0);
                } else {
                	file.setFileLevel(1);
                }
                
                fList.add(file);
           }
           
           int result = boardService.insertBoard(board, boardWriter, fList);
           
           if(result>0) msg = "게시글 등록 성공";
		   else		 msg = "게시글 등록 실패";
					
		   request.getSession().setAttribute("msg", msg);
		   response.sendRedirect("list");
       }
   } catch (Exception e) {
   	ExceptionForward.errorPage(request, response, "게시글 등록", e);
   }
}   
       
            
            

'study > WebServer' 카테고리의 다른 글

10_ws_(EL, JSTL)  (0) 2020.02.11
8_ws_(페이징처리)  (0) 2020.01.22
7_ws_(암호화)  (0) 2020.01.17
6_ws_(session)  (0) 2020.01.16
5_ws_(mapge 수정정보창)  (0) 2020.01.15