728x90
반응형
파일을 전송하기 위한 조건 **가장 먼저는 파일을 업로드하기 위한 라이브러리르 추가해야만 한다. 1. <input type="file">인 속성을 기술해야만 파일 첨부가 가능. 2. <form enctype="multipart/form-data" method="post" > 반드시 method="post"이어야만 한다. 3. <form > 를 기술해주어야 한다. |
a
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script> function addFileFnc(){ //document.getElementById("addFileBtn").previousSibling //=>id가 addFileBtn인 태그의 바로 형 태그를 가져오기 //.getAttribute("name") =>위에서 가져온 input type="file" name="filename1"인 // 태그의 name속성값 가져오기 =>filename1 //.replace("filename","") => 위에서 가져온 filename1문자열에서 filename문자열값을""빈 문자열로 바꾸기 //최종으로 떼어온 값은 "1"이 되며 이것을 Number("1")을 이용하여 숫자값 1로 변경함. //그 후로 +1일 더한 값을 fileAttr변수가 받는다. let fileAttr = Number(document.getElementById("addFileBtn").previousSibling.getAttribute("name").replace("filename",""))+1; //document.querySelectorAll("input[type=file]")[document.querySelectorAll("input[type=file]").length-1] console.log("fileAttr : " + fileAttr); //2~5 //document.querySelectorAll("input[type=file]")=> input태그 중 type="file"인 태그들을 모두 배열로 가져옴. //document.querySelectorAll("input[type=file]").length => 위에서 가져온 배열의 길이를 가져옴 let fileLength = document.querySelectorAll("input[type=file]").length; console.log("fileLength : " + fileLength); //1~4 //.cloneNode(true) => 해당 태그 및 자식 노드까지 모두 복제하기 let btn = document.getElementById("addFileBtn").cloneNode(true); console.log("btn : " + btn); //[object HTMLButtonElement] // document.getElementById("addFileBtn")=>id가 addFileBtn인 버튼 태그를 // .remove(); => 해당 버튼 태그 및 자식 노트까지 모두 제거하기 document.getElementById("addFileBtn").remove(); //undefined //document.getElementById("filesDiv").innerHTML 안의 자식요소를 html형식으로 먼저 가져 온 뒤 // 그 뒤에 '<p> 파 일 : <input type="file" name="filename' + (fileAttr)+'"><button type="button" id="addFileBtn" onclick="addFileFnc()">버튼추가</button></p>' 를 결합하기 // 위에 조합한 내용을 id가 fileDiv인 태그 안에 자식 태그로 html형식으로 넣기 let btn1 = document.getElementById("filesDiv").innerHTML += '<p> 파 일 : <input type="file" name="filename' + (fileAttr)+'"><button type="button" id="addFileBtn" onclick="addFileFnc()">버튼추가</button></p>'; console.log("btn1 : " + btn1); //fileAttr값이 2일때 엘리먼트가 추가된 상태가 아니므로 fileLength의 갯수는 1임 //fileAttr값보다 filesLength의 갯수가 항상 1보다 작게 되므로, filesLength == 4 라는 조건으로 걸어준 것임. if(fileLength == 4) document.getElementById("addFileBtn").remove(); } let extArr = ["jpg","png","gif","jpeg","svg","bmp"]; window.onload = function(){ //이벤트 등록함수 //name속성의 값이 fileForm인 form태그에 submit이 실행되었을때 동작하는 이벤트 등록 fileForm.addEventListener('submit', function(e){ //lenTF => 파일을 5개까지 업로드만 가능하도록 제한할 때 사용할 변수 //extTF => 파일의 확장자를 [배열내 정의한 파일명]만 업로드 할 수 있도록 제한할 때 사용할 변수 let lenTF = false, extTF = false; console.log("") //document.querySelector("input[type=file]") Selector태그들 중 맨 처음 인덱스의 태그 한 개만 가져오기 //.files => 위 태그에 업로드한 파일의 목록을 {} 오브젝트 형식의 객체로 가져오기 let imgs = document.querySelector("input[type=file]").files; console.log("img : "+ img); //업로드한 파일들 중에서 확장자가 일치하는 파일의 갯수를 저장할 변수 let cnt = 0; for(let i = 0 ; i < imgs.length; i++){ //imgs[i] => 내가 업로드한 이미지 파일 목록 중 i번째 인덱스에 해당되는 파일 가져오기 //.name => 위에서 가져온 이미지 파일의 파일명만 문자열로 가져오기 //.lastIndexOf(".") => 위에서 가져온 파일명 문자열에서 뒤에서 부터 체크하며 . 기호가 있는 곳을 찾아서 //해당 인덱스 번호 반환하기 (인덱스 번호는 왼쪽에서부터 세어올 것) //.lastIndexOf(".")+1 => 위에서 가져온 인덱스 번호에 1을 더할 것 // ex)cute_dog.jpg=> [1~8] //imgs[i].name.substring(위에서 가져온 9가 들어옴) => i번째 이미지파일문자열 중 9번인덱스부터 //마지막까지만 떼어오기 ex)cute_dog.jpg=> jpg let extension = imgs[i].name.substring(imgs[i].name.lastIndexOf(".")+1); //let extArr = ["jpg","png","gif","jpeg","svg","bmp"]; //위의 배열을 하나씩 돌려서 해당 요소값 을 하나씩 떼어와 obj에 담기 //obj값(위 배열에서 떼어온 한 개의 요소값)과 위에서 떼어온 확장자값이 일치하는지 체크하여 cnt증가시키기 //파일을 업로드한 갯수만큼 cnt가 생성되고, 이 값과 files.length의 값이 일치하면 모두 //업로드 가능한 확장자만 넣은 것이되고, 값이 다른 경우는 위의 extArr안의 확장자가 아닌 다른 확장자의 //파일이 올라온 것이 됨.(이미지 파일들만 업로드할 수 있도록 제한하기 위해 count세는 작업 처리) extArr.forEach(function(obj){ if(obj == extension.toLowerCase()) cnt++; }); } //if문 => 허락되지 않은 확장자 파일이 올라온 경우. , else문 => 모두 허락된 확장자의 파일이 올라온 경우 실행됨 if(cnt != imgs.length) alert("이미지 파일만 업로드 하실 수 있습니다."); else extTF = true; //업로드한 이미지 파일의 갯수 세어오기(최대 5개의 파일까지만 업로드할 수 있도록 제한하기 위한 로직) let fileLength = imgs.length; //if문 => 파일을 5개 초과로 올릴 경우 실행, else문 => 파일을 5개 이하로 올릴 경우 실행됨. if(fileLength > 5){ alert("파일은 최대 5개까지만 업로드 할 수 있습니다."); } else { lenTF = true; } //파일의 갯수가 5개를 초과하고, 파일의 확장자가 허락되지 않은 파일이 올라온 경우 //e.preventDefault() => action이 실행되지 못하도록 처리하기 if(!(lenTF && extTF)){ e.preventDefault(); } }); }; </script> </head> <body> <h2>MultipartRequest를 이용한 파일 업로드</h2> <dl> <dd>- cos.jar파일 필요: <a href="http://www.servlets.com/cos/">다운받기</a></dd> </dl> <form name="fileForm" method="post" enctype="multipart/form-data" action="11_01_fileupload01_process.jsp"> <fieldset name="fld"> <legend>파일 업로드 폼</legend> <p>이 름 : <input type="text" name="name"></p> <p>제 목 : <input type="text" name="subject"></p> <div id="filesDiv"> <!-- <p>파 일 : <input type="file" name="filename" multiple></p> --> <p>파 일 : <input type="file" name="filename1"><button type="button" id="addFileBtn" onclick="addFileFnc()">버튼 추가</button></p> </div> <p><input type="submit" value="파일 올리기"></p> </fieldset> </form> </body> </html>
728x90
반응형