-
[JavaScript] 첨부파일 다중파일 multiple 업로드JavaScript 2021. 9. 2. 11:20
Ver1. 파일 첨부 시 최대 개수가 넘으면 현재 선택된 파일은 전부 첨부를 안 하는 방식.
See the Pen [T] 다중파일 업로드 v1 by green526 (@green526) on CodePen.
Ver2. 파일 첨부 시 최대 개수를 넘으면 최대 개수 까지만 첨부하는 방식.
See the Pen by green526 (@green526) on CodePen.
코드
더보기html
<div class="insert"> <form method="POST" onsubmit="return false;" enctype="multipart/form-data"> <input type="file" onchange="addFile(this);" multiple /> <div class="file-list"></div> </form> </div>
css
.insert { padding: 20px 30px; display: block; width: 600px; margin: 5vh auto; height: 90vh; border: 1px solid #dbdbdb; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .insert .file-list { height: 200px; overflow: auto; border: 1px solid #989898; padding: 10px; } .insert .file-list .filebox p { font-size: 14px; margin-top: 10px; display: inline-block; } .insert .file-list .filebox .delete i{ color: #ff5353; margin-left: 5px; }
javascript
var fileNo = 0; var filesArr = new Array(); // Ver1. /* 첨부파일 추가 */ function addFile(obj){ var maxFileCnt = 5; // 첨부파일 최대 개수 var attFileCnt = document.querySelectorAll('.filebox').length; // 기존 추가된 첨부파일 개수 var remainFileCnt = maxFileCnt - attFileCnt; // 추가로 첨부가능한 개수 var curFileCnt = obj.files.length; // 현재 선택된 첨부파일 개수 // 첨부파일 개수 확인 if (curFileCnt > remainFileCnt) { alert("첨부파일은 최대 " + maxFileCnt + "개 까지 첨부 가능합니다."); } else { for (const file of obj.files) { // 첨부파일 검증 if (validation(file)) { // 파일 배열에 담기 var reader = new FileReader(); reader.onload = function () { filesArr.push(file); }; reader.readAsDataURL(file); // 목록 추가 let htmlData = ''; htmlData += '<div id="file' + fileNo + '" class="filebox">'; htmlData += ' <p class="name">' + file.name + '</p>'; htmlData += ' <a class="delete" onclick="deleteFile(' + fileNo + ');"><i class="far fa-minus-square"></i></a>'; htmlData += '</div>'; $('.file-list').append(htmlData); fileNo++; } else { continue; } } } // 초기화 document.querySelector("input[type=file]").value = ""; } // Ver2. /* 첨부파일 추가 */ function addFile(obj){ var maxFileCnt = 5; // 첨부파일 최대 개수 var attFileCnt = document.querySelectorAll('.filebox').length; // 기존 추가된 첨부파일 개수 var remainFileCnt = maxFileCnt - attFileCnt; // 추가로 첨부가능한 개수 var curFileCnt = obj.files.length; // 현재 선택된 첨부파일 개수 // 첨부파일 개수 확인 if (curFileCnt > remainFileCnt) { alert("첨부파일은 최대 " + maxFileCnt + "개 까지 첨부 가능합니다."); } for (var i = 0; i < Math.min(curFileCnt, remainFileCnt); i++) { const file = obj.files[i]; // 첨부파일 검증 if (validation(file)) { // 파일 배열에 담기 var reader = new FileReader(); reader.onload = function () { filesArr.push(file); }; reader.readAsDataURL(file) // 목록 추가 let htmlData = ''; htmlData += '<div id="file' + fileNo + '" class="filebox">'; htmlData += ' <p class="name">' + file.name + '</p>'; htmlData += ' <a class="delete" onclick="deleteFile(' + fileNo + ');"><i class="far fa-minus-square"></i></a>'; htmlData += '</div>'; $('.file-list').append(htmlData); fileNo++; } else { continue; } } // 초기화 document.querySelector("input[type=file]").value = ""; } /* 첨부파일 검증 */ function validation(obj){ const fileTypes = ['application/pdf', 'image/gif', 'image/jpeg', 'image/png', 'image/bmp', 'image/tif', 'application/haansofthwp', 'application/x-hwp']; if (obj.name.length > 100) { alert("파일명이 100자 이상인 파일은 제외되었습니다."); return false; } else if (obj.size > (100 * 1024 * 1024)) { alert("최대 파일 용량인 100MB를 초과한 파일은 제외되었습니다."); return false; } else if (obj.name.lastIndexOf('.') == -1) { alert("확장자가 없는 파일은 제외되었습니다."); return false; } else if (!fileTypes.includes(obj.type)) { alert("첨부가 불가능한 파일은 제외되었습니다."); return false; } else { return true; } } /* 첨부파일 삭제 */ function deleteFile(num) { document.querySelector("#file" + num).remove(); filesArr[num].is_delete = true; } /* 폼 전송 */ function submitForm() { // 폼데이터 담기 var form = document.querySelector("form"); var formData = new FormData(form); for (var i = 0; i < filesArr.length; i++) { // 삭제되지 않은 파일만 폼데이터에 담기 if (!filesArr[i].is_delete) { formData.append("attach_file", filesArr[i]); } } $.ajax({ method: 'POST', url: '/register', dataType: 'json', data: formData, async: true, timeout: 30000, cache: false, headers: {'cache-control': 'no-cache', 'pragma': 'no-cache'}, success: function () { alert("파일업로드 성공"); }, error: function (xhr, desc, err) { alert('에러가 발생 하였습니다.'); return; } }) }
참고
'JavaScript' 카테고리의 다른 글
[JavaScript][링크스크랩] 스크롤 맨 아래로 내리기 (0) 2021.09.15 [JavaScript] 첨부파일 다중파일 multiple 업로드 2 (0) 2021.09.02 [JavaScript] 파일 첨부 시 파일타입 체크하기 (0) 2021.09.01 [JavaScript] [링크스크랩] 첨부파일 다운로드 시 체크박스 (0) 2021.08.31 [JavaScript] 문자열 삽입, 스트링, String (0) 2021.08.30