웹에서 File 선택하기(파일 열기 대화상자 or 파일 드래그&드랍)

웹에서 파일을 선택하기 위해서는 사용자의 행위가 필요한데, 파일 열기 대화상자를 통해 파일을 선택해 주거나 파일을 드래그해서 웹브라우저에 드랍해줘야합니다.

먼저 파일을 드랍해서 떨굴 영역을 마련해 줍니다.

이곳을 클릭하거나
이곳에 파일을 드래그 하세요.

.file-zone에 대한 div 영역이 파일을 드랍해서 떨굴 영역입니다.

JS 코드는 다음과 같습니다.

fileZone.addEventListener("drop", (event) => {
    const files = event.dataTransfer.files;
    const file = files[0];
    if(file) {
        processFile(file);
    }

    event.preventDefault();
});

fileZone.addEventListener("dragover", (event) => {
    event.preventDefault();
});

processFile은 떨군 파일을 처리하는 함수인데요. 예를 들면 다음과 같습니다.

function processFile(file) {
    const name = file.name;
    const size = file.size;
    const reader = new FileReader();

    reader.onload = function() {
        const aBuf = this.result; // ArrayBuffer
        //const dView = new DataView(aBuf);
        //const validFlag = dView.getUint8(0);
        //const numRecords = dView.getInt32(4, true);

        const MD5 = CryptoJS.MD5(aBuf).toString();
        const SHA256 = CryptoJS.SHA256(aBuf).toString();
        
        gwcMessage(`Size ${size} bytes
MD5 ${MD5}
SHA256 ${SHA256}`); }; const blob = file.slice(0, size); reader.readAsArrayBuffer(blob); }

이제 파일 열기 대화상자를 통해 file을 선택해 처리해보겠습니다. 앞서 HTML 코드를 보면 file 타입의 input tag가 있는데 이 DOM 요소를 통해 파일 열기 대화상자를 표시합니다. 이 DOM 요소의 display는 none으로 해서 화면에 보이지 않도록 하는게 일반적입니다.

JS 코드는 다음과 같습니다.

const fileZone = document.querySelector(".file-zone");

fileZone.addEventListener("click", () => {
    document.querySelector("input").click();
});

document.querySelector("input").onchange = function() {
    const file = this.files[0];
    if(file) {
        processFile(file);
    }                
};

#GWC UI Library : IconButton

웹 UI 라이브러리인 GWC에서 제공하는 IconButton 컴포넌트에 대한 예제 코드입니다.

먼저 DOM 구성은 다음과 같습니다.

그리고 CSS 구성은 다음과 같구요.

.center {
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
}

js 코드는 다음과 같습니다.

window.onload = () => {
    button1.addEventListener("click", () => { 
        gwcMessage("ADD 버튼 클릭");
    });

    button2.addEventListener("click", () => {
        gwcMessage("CREATE 버튼 클릭");
    });

    button3.addEventListener("click", () => {
        gwcMessage("TOOLS 버튼 클릭");
    });
};

실행 결과는 다음과 같습니다.

#GWC UI Library : RangeSlider

웹 UI 라이브러리인 GWC에서 제공하는 RangeSlider 컴포넌트에 대한 예제 코드입니다.

먼저 DOM 구성은 다음과 같습니다.

그리고 CSS 구성은 다음과 같구요.

.center {
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    gap: 3em;
}

#rangeslider {
    width: 20em;
}

js 코드는 다음과 같습니다.

window.onload = () => {
    rangeslider.addEventListener("change", () => {
        label.content = `슬라이더 값 변경: ${rangeslider.value1.toFixed(1)} - ${rangeslider.value2.toFixed(1)}`;
    });

    button1.addEventListener("click", () => {
        gwcMessage(`범위 슬라이더의 현재 값은 ${rangeslider.value1.toFixed(1)} - ${rangeslider.value2.toFixed(1)}입니다.`);
    });

     button2.addEventListener("click", () => {
        rangeslider.label = "신장";
        rangeslider.min = 30;
        rangeslider.max = 250;
        rangeslider.value1 = 160;
        rangeslider.value2 = 190;
        rangeslider.toFixed = 0;
        rangeslider.unit = "cm";
    });    

    GeoServiceWebComponentManager.instance.update();
};

실행 결과는 다음과 같습니다.

#GWC UI Library : Progress

웹 UI 라이브러리인 GWC에서 제공하는 Progress 컴포넌트에 대한 예제 코드입니다.

먼저 DOM 구성은 다음과 같습니다.

그리고 CSS 구성은 다음과 같구요.

.center {
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    gap: 3em;
}

#progress1 {
    width: 25em;
}

#progress2 {
    width: 20em;
}

js 코드는 다음과 같습니다.

window.onload = () => {
    button.addEventListener("click", () => {
        setInterval(() => {
            progress1.setAttribute("label", `완성율 ${parseInt(progress1.percent)}%`)
            progress1.percent += Math.random() * 10 - 3.5;
    
            if(progress1.percent == 100) progress1.percent = 0;
        }, 150);
    
        progress1.addEventListener("progress", (event) => {
            label.content = `progress1의 percent 속성값이 ${event.target.percent.toFixed(2)}로 변경되었습니다.`;
        });
    });
};

실행 결과는 다음과 같습니다.