-
드래그 멀티파일 업로드Alone Proejct 2024. 3. 13. 14:03
ㅁ HTML
<div class="cont drop-area"> </div>
ㅁ CSS
.drop-area { border: 2px dashed #ccc; border-radius: 20px; width: 100%; /*margin: 50px auto;*/ padding: 20px; } .drop-area.highlight { border-color: hotpink; /*border : solid;*/ }
JAVASCRIPT
//2024.01.16 CHU 드래그 업로드 // let dropArea = document.getElementById('drop-area'); const fileUpload = (data,idx) => { // console.log('data : ',data); // console.log('idx : '+idx); //화면 처리 } let dropAreas = document.getElementsByClassName('drop-area'); Array.from(dropAreas).forEach(dropArea => { ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { dropArea.addEventListener(eventName, preventDefaults, false); }); ['dragenter', 'dragover'].forEach(eventName => { dropArea.addEventListener(eventName, highlight, false); }); ['dragleave', 'drop'].forEach(eventName => { dropArea.addEventListener(eventName, unhighlight, false); }); dropArea.addEventListener('drop', handleDrop, false); }); //이벤트 방부제 처리 function preventDefaults (e) { e.preventDefault(); e.stopPropagation(); } function highlight(e) { e.currentTarget.classList.add('highlight'); } function unhighlight(e) { e.currentTarget.classList.remove('highlight'); } function handleDrop(e) { let data = e.dataTransfer; let files = data.files; // console.log('e ',e.target); // console.log('fild id ',$(e.target).parents('.drop-area').find(':file').attr('id')); const idx = $(":file").index($('#'+$(e.target).parents('.drop-area').find(':file').attr('id'))); // console.log('idx : ',idx); if (data.items) { // DataTransferItemList 객체 사용 console.log('파일 수 : '+data.items.length); fileAmount = 0; fileAmount = data.items.length; let target = $("#item_tab3 .entered:eq("+idx+")").prev(); let p_html = `<p class="p_amount" style="color: black;margin-top:50px;"><span class="Amount" style="color">0</span> / <span style="color: hotpink">`+fileAmount+`</spa> 업로드 중</p>` target.append(p_html); for (var i = 0; i < data.items.length; i++) { // DataTransferItem 객체 사용 if (data.items[i].kind == "file") { // 아이템 종류가 파일이면 var file = data.items[i].getAsFile(); // File API 사용 // console.log('file : ',file); // console.log('file : '+file.name); // alert('1 : '+file.name); } } } else { // File API 사용 for (var i = 0; i < data.files.length; i++) { // alert('2 : '+data.files[i].name); console.log('else ',data.files[i].name) } } handleFiles(files,idx,data.items.length); } function handleFiles(files,idx,amount) { // console.log('handleFiles In'); [...files].forEach((file, fileIndex) => uploadFile(file, idx,amount)); } /** * * @param file * @param idx * @param amount 파일 갯수 * @returns {Promise<void>} */ async function uploadFile(file,idx,amount) { // console.log('uploadFile idx',idx); let url = "/s/comm/file/uploadFileThumbAjax.do"; let formData = new FormData(); let imgName =''; if(idx==0 || idx==1){ imgName = "P"; } formData.append('file', file); formData.append('idxName', imgName); fn_showProgressBar(); const response = await fetch(url, { method: 'POST' ,body: formData }) .then(async response => { //프로그래스 바 처리 fn_hideProgressBar(); fileAmount = $("#item_tab3 .entered:eq("+idx+")").prev().find('.Amount').text()*1+1; $("#item_tab3 .entered:eq("+idx+")").prev().find('.Amount').text(fileAmount); amount === fileAmount ? blinkAndFadeOut($("#item_tab3 .entered:eq("+idx+")").prev().find('.p_amount'), 3000) : ''; //프로그래바 처리 끝 // response.ok는 HTTP 상태 코드가 200-299인 경우 true를 반환합니다. if (!response.ok) { console.log('Error : ', response); throw new Error('Network response was not ok'); } /* fieldName : file fileNm : a4d1feef917846c1b83003a4a58ccfda.png fileOrgNm : 스크린샷 2024-01-11 150153.png fileUrl : /common/temp fileFullUrl : /common/temp/a4d1feef917846c1b83003a4a58ccfda.png */ const data = await response.json(); for( let files of data['fileInfo']){ fileUpload(files,idx); } // return response.json(); // 서버로부터 받은 JSON 데이터를 파싱합니다. }) .catch(error => { // 네트워크 오류 또는 response.ok가 false인 경우의 에러 처리 console.log('Fetch 에러:', error); }); // console.log('성공:', data); }