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
반응형

+ Recent posts