Alone Proejct
드래그 멀티파일 업로드
FunnyDevelop
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);
}