ì´ë² ì±í°ìì íì¼ ì¬ë¶ë ì¶ê° íë ì¬ë¶ ë±ê³¼ ìê´ìì´ íµì©ëë HTML í¼(form) ì ì¡ ë°©ë²ì ëí´ ììë³´ê² ìµëë¤.
FormDataë í¼ì ì½ê² ë³´ë´ëë¡ ëì주ë ê°ì²´ì
ëë¤. ì´ë¦ì ë³´ê³ ì ì¶íì
¨ë¯ì´ FormData ê°ì²´ë HTML í¼ ë°ì´í°ë¥¼ ëíë
ëë¤.
ìì±ìë ë¤ìê³¼ ê°ìµëë¤.
let formData = new FormData([form]);
HTMLì form ììê° ìë ê²½ì°, ìì ê°ì ì½ë를 ìì±íë©´ í´ë¹ í¼ ììì íë ì ì²´ê° ìë ë°ìë©ëë¤.
fetch ë±ì ë¤í¸ìí¬ ë©ìëê° FormData ê°ì²´ë¥¼ ë°ëë¡ ë°ëë¤ë ê±´ FormDataì í¹ì§ì
ëë¤. ì´ë ë¸ë¼ì°ì ê° ë³´ë´ë HTTP ë©ìì§ë ì¸ì½ë©ëê³ Content-Type ìì±ì multipart/form-dataë¡ ì§ì ë í ì ì¡ë©ëë¤.
ìë² ê´ì ìì FormData를 ì¬ì©í ë°©ìê³¼ ì¼ë° í¼ ì ì¡ ë°©ìì ì°¨ì´ê° ììµëë¤
ê°ë¨í í¼ ì ì¡í기
ì주 ê°ë¨í í¼ì ì ì¡íë¤ê³ ê°ì í´ë´ ìë¤.
ë³´ìë¤ìí¼ ì주 ì§§ì ì½ëë¡ë ì ì¡ ì²ë¦¬ê° ê°ë¥í©ëë¤.
<form id="formElem">
<input type="text" name="name" value="Bora">
<input type="text" name="surname" value="Lee">
<input type="submit">
</form>
<script>
formElem.onsubmit = async (e) => {
e.preventDefault();
let response = await fetch('/article/formdata/post/user', {
method: 'POST',
body: new FormData(formElem)
});
let result = await response.json();
alert(result.message);
};
</script>
ìì²ì ë°ì ì²ë¦¬íë ìë² ì¸¡ ì½ëë íí ë¦¬ì¼ ë²ì를 ëì´ìì ì¶ê°íì§ ììëë°, ìë²ë POST ìì²ì ë°ì 'ì ì¥ ì±ê³µâì´ë¼ë ìëµì ë³´ë´ì¤ë¤ê³ ì ëë§ ìê³ ê³ìë©´ ë©ëë¤.
FormData ë©ìë
FormDataì ìíë íëë ìëì ê°ì ë©ìëë¡ ìì í ì ììµëë¤.
formData.append(name, value)ânameê³¼value를 ê°ì§ í¼ íë를 ì¶ê°formData.append(name, blob, fileName)â<input type="file">ííì íë를 ì¶ê°. ì¸ ë²ì§¸ ì¸ìfileNameì (íë ì´ë¦ì´ ìëê³ ) ì¬ì©ìê° í´ë¹ ì´ë¦ì ê°ì§ íì¼ì í¼ì ì¶ê°í ê²ì²ë¼ ì¤ì í´ì¤formData.delete(name)ânameì í´ë¹íë íë를 ìì formData.get(name)ânameì í´ë¹íë íëì ê°ì ê°ì ¸ì´formData.has(name)ânameì í´ë¹íë íëê° ìì¼ë©´true를, ê·¸ë ì§ ìì¼ë©´false를 ë°í
í¼ì ì´ë¦(name)ì´ ê°ì íë ì¬ë¬ ê°ë¥¼ íì©í기 ë문ì append ë©ìë를 ì¬ë¬ ë² í¸ì¶í´ ì´ë¦ì´ ê°ì íë를 ê³ì ì¶ê°í´ë 문ì ê° ììµëë¤.
append ë©ìë ì´ì¸ì íë ì¶ê° ì ì¬ì©í ì ìë ë©ìëë¡ setë ììµëë¤. setì´ append ë©ìëì ë¤ë¥¸ ì ì setì nameê³¼ ëì¼í ì´ë¦ì ê°ì§ íë를 모ë ì ê±°íê³ ìë¡ì´ íë íë를 ì¶ê°íë¤ë ë° ììµëë¤. ë°ë¼ì set ë©ìë를 ì°ë©´ nameì ê°ì§ íëê° ë¨ í ê°ë§ ìê²ë ë³´ì¥í ì ììµëë¤. ì´ ì¸ì ë¤ë¥¸ 기ë¥ì append ë©ìëì ëì¼í©ëë¤.
formData.set(name, value)formData.set(name, blob, fileName)
ì°¸ê³ ë¡ í¼ ë°ì´í° íëì ë°ë³µ ìì
ì í ë for..of 루í를 ì¬ì©í ì ììµëë¤.
let formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');
// key/value ìì´ ë´ê¸´ 리ì¤í¸
for(let [name, value] of formData) {
alert(`${name} = ${value}`); // key1 = value1, then key2 = value2
}
íì¼ì´ ìë í¼ ì ì¡í기
í¼ì ì ì¡í ë HTTP ë©ìì§ì Content-Type ìì±ì íì multipart/form-dataì´ê³ ë©ìì§ë ì¸ì½ë©ëì´ ì ì¡ë©ëë¤. íì¼ì´ ìë í¼ë ë¹ì°í ì´ ê·ì¹ì ë°ë¥´ê¸° ë문ì <input type="file">ë¡ ì§ì í íë ìì ì¼ë° í¼ì ì ì¡í ëì ì ì¬íê² ì ì¡ë©ëë¤.
íì¼ì´ ìë í¼ ìì를 ì´í´ë´ ìë¤.
<form id="formElem">
<input type="text" name="firstName" value="Bora">
Picture: <input type="file" name="picture" accept="image/*">
<input type="submit">
</form>
<script>
formElem.onsubmit = async (e) => {
e.preventDefault();
let response = await fetch('/article/formdata/post/user-avatar', {
method: 'POST',
body: new FormData(formElem)
});
let result = await response.json();
alert(result.message);
};
</script>
Blob ë°ì´í°ê° ìë í¼ ì ì¡í기
fetch ì±í°ìì ì´í´ë³¸ ë°ì ê°ì´ ì´ë¯¸ì§ ê°ì ëì ì¼ë¡ ìì±ë ë°ì´ë리 íì¼ì Blob ê°ì²´ë¥¼ ì¬ì©í´ ì½ê² ì ì¡í ì ììµëë¤. ì´ë Blob ê°ì²´ë fetch ë©ìëì body 매ê°ë³ìì ë°ë¡ ëê²¨ì¤ ì ìì£ .
ê·¸ë°ë° ì¤ì ì½ë©ì íë¤ ë³´ë©´ ì´ë¯¸ì§ë¥¼ ë³ëë¡ ë겨주ë ê²ë³´ë¤ í¼ì íë를 ì¶ê°íê³ ì¬ê¸°ì ì´ë¯¸ì§ âì´ë¦â ë±ì ë©íë°ì´í°ë¥¼ ê°ì´ ì¤ì´ ë겨주ë ê² ì¢ ë í¸ë¦¬í©ëë¤.
ìë² ì ì¥ììë ìì ë°ì´ë리 ë°ì´í°ë¥¼ ë°ë ê²ë³´ë¤ multipart-encoded í¼ì ë°ë ê² ì¢ ë ì í©íì£ .
ìëë <canvas>를 ì¬ì©í´ ë§ë ì´ë¯¸ì§ë¥¼ FormData를 ì¬ì©í´ í¼ ííë¡ ë¤ë¥¸ ì¶ê° íëì í¨ê» ì ì¡íë ììì
ëë¤.
<body style="margin:0">
<canvas id="canvasElem" width="100" height="80" style="border:1px solid"></canvas>
<input type="button" value="ì´ë¯¸ì§ ì ì¡" onclick="submit()">
<script>
canvasElem.onmousemove = function(e) {
let ctx = canvasElem.getContext('2d');
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
};
async function submit() {
let imageBlob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
let formData = new FormData();
formData.append("firstName", "Bora");
formData.append("image", imageBlob, "image.png");
let response = await fetch('/article/formdata/post/image-form', {
method: 'POST',
body: formData
});
let result = await response.json();
alert(result.message);
}
</script>
</body>
ìììì ì´ë¯¸ì§ Blobì ì¶ê°í ì½ë를 ë¤ì ë´
ìë¤.
formData.append("image", imageBlob, "image.png");
ì´ ì½ëë í¼ì <input type="file" name="image"> íê·¸ê° ìê³ , ì¬ì©ì 기기ì íì¼ ìì¤í
ìì íì¼ëª
ì´ "image.png"(3ë²ì§¸ ì¸ì ì°¸ê³ )ì¸ imageBlob ë°ì´í°(2ë²ì§¸ ì¸ì ì°¸ê³ )를 ì¶ê°í ê²ê³¼ ëì¼í í¨ê³¼ë¥¼ ì¤ëë¤.
ìì²ì ë°ì ìë²ë ì¼ë° í¼ê³¼ ëì¼íê² í¼ ë°ì´í°ì íì¼ì ì½ê³ ì²ë¦¬í©ëë¤.
ìì½
FormData ê°ì²´ë fetch ë±ì ë¤í¸ìí¬ ë©ìë를 íµí´ HTML í¼ì ë³´ë´ëë° ì¬ì©ë©ëë¤.
FormData ê°ì²´ë HTML í¼(form)ì ì§ì ë겨 new FormData(form)ì¼ë¡ ë§ë¤ ìë ìê³ , HTML í¼ ìì´ ë¤ìê³¼ ê°ì ë©ìëë¡ íë를 ì¶ê°í´ ë§ë¤ ìë ììµëë¤.
formData.append(name, value)formData.append(name, blob, fileName)formData.set(name, value)formData.set(name, blob, fileName)
ë©ìë를 ì¬ì©í ë 주ìí ì 2ê°ì§ê° ììµëë¤.
setë©ìëënameì´ ê°ì íë 모ë를 ì§ì°ê³appendë ê·¸ë ì§ ììµëë¤. ë¤ë¥¸ ì°¨ì´ë ììµëë¤.- íì¼ì ë³´ë¼ ë ì¸ ë²ì§¸ ì¸ìê° íìíë° ì´ ì¸ìë ì¬ì©ì íì¼ ìì¤í ìì ì§ì í íì¼ëª ê³¼ ëì¼íê² ì§ì ë©ëë¤.
ì´ì¸ìë ë¤ìê³¼ ê°ì ë©ìëê° ììµëë¤
formData.delete(name)formData.get(name)formData.has(name)
ë¤ë£° ë´ì©ì ì¬ê¸°ê¹ì§ì ëë¤!
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.