File Upload

이 μ˜ˆμ œμ—μ„œλŠ” 파일 μ—…λ‘œλ“œ 양식을 μƒμ„±ν•˜κ³  Ajaxλ₯Ό 톡해 μ œμΆœν•˜λŠ” 방법과 ν•¨κ»˜ 진행 상황을 ν‘œμ‹œν•˜λŠ” 진행 λ§‰λŒ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

μ—¬κΈ°μ„œλŠ” 두 가지 κ΅¬ν˜„ 방식을 μ†Œκ°œν•©λ‹ˆλ‹€. ν•˜λ‚˜λŠ” 순수 JavaScriptλ₯Ό μ‚¬μš©ν•œ 방식이고, λ‹€λ₯Έ ν•˜λ‚˜λŠ” hyperscriptλ₯Ό μ‚¬μš©ν•œ λ°©μ‹μž…λ‹ˆλ‹€.

λ¨Όμ € 순수 JavaScript λ²„μ „μž…λ‹ˆλ‹€.

<form id='form' hx-encoding='multipart/form-data' hx-post='/upload'>
    <input type='file' name='file'>
    <button>
        Upload
    </button>
    <progress id='progress' value='0' max='100'></progress>
</form>
<script>
    htmx.on('#form', 'htmx:xhr:progress', function(evt) {
      htmx.find('#progress').setAttribute('value', evt.detail.loaded/evt.detail.total * 100)
    });
</script>

Hyperscript 버전은 맀우 μœ μ‚¬ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 차이가 μžˆμŠ΅λ‹ˆλ‹€:

    <form hx-encoding='multipart/form-data' hx-post='/upload'
          _='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'>
        <input type='file' name='file'>
        <button>
            Upload
        </button>
        <progress id='progress' value='0' max='100'></progress>
    </form>

참고둜, hyperscriptλŠ” details의 속성을 λ³€μˆ˜λ‘œ 직접 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.