ãã®ãã£ãã¿ã¼ã¯ HTML ãã©ã¼ã ã®éä¿¡ã«ã¤ãã¦èª¬æãã¾ã: ãã¡ã¤ã«æç¡ã追å ã®ãã£ã¼ã«ããªã©ãFormData ãªãã¸ã§ã¯ãã¯ãããã®å ´åã«å½¹ç«ã¡ã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¯æ¬¡ã®éãã§ã:
let formData = new FormData([form]);
HTML form è¦ç´ ãæä¾ããã¦ããå ´åãèªåçã«ãã®ãã£ã¼ã«ããæãã¾ãããæ³åã®ã¨ããã FormData ã¯ãã©ã¼ã ãã¼ã¿ãä¿åãããéä¿¡ãããããããã®ãªãã¸ã§ã¯ãã§ãã
FormData ã«é¢ãã¦ç¹å¥ãªãã¨ã¯ãfetch ã®ãããªãããã¯ã¼ã¯ã¡ã½ããããæ¬ä½(ããã£)ã¨ã㦠FormData ãªãã¸ã§ã¯ããåãå
¥ãããã¨ãã§ããã¨ããç¹ã§ããã¨ã³ã³ã¼ããããContent-Type: form/multipart ã§éä¿¡ããã¾ãããªã®ã§ããµã¼ãå´ããè¦ãã¨ãé常ã®ãã©ã¼ã éä¿¡ã®ããã«è¦ãã¾ãã
ã·ã³ãã«ãªãã©ã¼ã ã®éä¿¡
æåã«ãã·ã³ãã«ãªãã©ã¼ã ãéä¿¡ãã¦ã¿ã¾ãããã
ã覧ã®éããã»ã¼1è¡ã§ã§ãã
<form id="formElem">
<input type="text" name="name" value="John">
<input type="text" name="surname" value="Smith">
</form>
<script>
(async () => {
let response = await fetch('/article/fetch-basics/post/user', {
method: 'POST',
body: new FormData(formElem)
});
let result = await response.json();
alert(result.message);
})();
</script>
ããã§ã¯ããµã¼ãã¼ã¯ãã©ã¼ã ã使ç¨ããPOSTè¦æ±ãåãå ¥ãã âUser savedâ ã¨è¿ä¿¡ãã¾ãã
FormData ã¡ã½ãã
次ã®ã¡ã½ããã使ã£ã¦ FormData ã®ãã£ã¼ã«ãã夿´ãããã¨ãã§ãã¾ã:
formData.append(name, value)â æå®ãããnameã¨valueã®ãã©ã¼ã ãã£ã¼ã«ãã追å ãã¾ããformData.append(name, blob, fileName)â<input type="file">ã®ããã«ãã£ã¼ã«ãã追å ãã¾ãã3ã¤ç®ã®å¼æ°fileNameã¯ãã¡ã¤ã«åãè¨å®ãã¾ã(ãã£ã¼ã«ãåã§ã¯ããã¾ãã)ããã¡ã¤ã«ã·ã¹ãã ã§ã®ãã¡ã¤ã«åã§ããformData.delete(name)â æå®ãããnameã®ãã£ã¼ã«ããåé¤ãã¾ããformData.get(name)â æå®ãããnameã®ãã£ã¼ã«ãå¤ãåå¾ãã¾ããformData.has(name)â æå®ãããnameã®ãã£ã¼ã«ããåå¨ããå ´åã«ã¯trueããããã§ãªããã°falseãè¿ãã¾ãã
ãã©ã¼ã ã¯ãæè¡çã«ã¯åã name ããã¤è¤æ°ã®ãã£ã¼ã«ããæã¤ãã¨ãå¯è½ãªã®ã§ãè¤æ°ã® append å¼ã³åºããããã¨ããã®ååãååã®ãã£ã¼ã«ãã追å ããã¾ãã
append ã¨åãæ§æã® set ã¡ã½ãããããã¾ããéã㯠.set ã¯æå®ããã name ã®ãã£ã¼ã«ãããã¹ã¦åé¤ãããã®å¾æ°ãããã£ã¼ã«ãã追å ãã¾ãããªã®ã§ãset ãããå ´åãname ã®ãã£ã¼ã«ãã1ã¤ã§ãããã¨ã確èªãã¦ã¿ã¦ãã ããã:
formData.set(name, value),formData.set(name, blob, fileName).
ã¾ããfor..of ã«ã¼ãã使ç¨ãã¦ãformData ãã£ã¼ã«ããå復ãããã¨ãã§ãã¾ã:
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
}
ãã¡ã¤ã«ãå«ããã©ã¼ã ãéä¿¡ãã
ãã©ã¼ã ã¯å¸¸ã« Content-Type: form/multipart ã¨ãã¦éä¿¡ããããã®ã¨ã³ã³ã¼ãã£ã³ã°ã¯ãã¡ã¤ã«ãéä¿¡ãããã¨ãå¯è½ã§ãããã®ãããé常ã®ãã©ã¼ã éä¿¡ã¨åæ§ã«ã <input type="file"> ãã£ã¼ã«ããéä¿¡ã§ãã¾ãã
ããã¯ããã®ãããªãã©ã¼ã ã®ä¾ã§ã:
<form id="formElem">
<input type="text" name="firstName" value="John">
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 ãéä¿¡ãã¾ã(e.g ç»å)ãfetch ãã©ã¡ã¼ã¿ã® body ã«ç´æ¥æå®ãããã¨ãã§ãã¾ãã
ããããå®éã«ã¯ç»åãåå¥ã«éä¿¡ããã®ã§ã¯ãªãããã©ã¼ã ã®ä¸é¨ã¨ãã¦ãânameâ ãä»ã®ã¡ã¿ãã¼ã¿ã®ãããªè¿½å ã®ãã£ã¼ã«ãã¨ä¸ç·ã«éä¿¡ããã®ã便å©ãªãã¨ãå¤ãã§ãã
ã¾ããé常ãµã¼ãã¯çã®ããªããªãã¼ã¿ããããã«ããã¼ãã¨ã³ã³ã¼ãå½¢å¼ãåãå ¥ããã®ã«é©ãã¦ãã¾ãã
ãã®ä¾ã¯ãFormData ã使ã£ã¦ä»ã®ãã£ã¼ã«ãã¨ä¸ç·ã« <canvas> ããã®ç»åãéä¿¡ãã¾ãã:
<body style="margin:0">
<canvas id="canvasElem" width="100" height="80" style="border:1px solid"></canvas>
<input type="button" value="Submit" 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", "John");
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çªç®ã®å¼æ°) ã¨ããååã®ãã¡ã¤ã«ãéä¿¡ããã®ã¨åãã§ãã
ãµããª
FormData ãªãã¸ã§ã¯ã㯠HTML ãã©ã¼ã ããã£ããã£ãã¦(æãã¦)ããããã fetch ãä»ã®ãããã¯ã¼ã¯ãªã¯ã¨ã¹ãã使ç¨ãã¦éä¿¡ããããã«ä½¿ããã¾ãã
HTML ãã©ã¼ã ãã new FormData(form) 使ããããããã¯ç©ºã®ãªãã¸ã§ã¯ã使ãã¦ããæ¬¡ã®ã¡ã½ããã§ãã£ã¼ã«ãã追å ãããã¨ãã§ãã¾ãã:
formData.append(name, value)formData.append(name, blob, fileName)formData.set(name, value)formData.set(name, blob, fileName)
2ã¤ã®ç¹å¾´ãããã¾ã:
setã¡ã½ããã¯åãååã®ãã£ã¼ã«ããåé¤ãã¾ããappendã¯åé¤ãã¾ããã- ãã¡ã¤ã«ãéä¿¡ããã«ã¯ã3ã¤ã®å¼æ°ã®æ§æãå¿
è¦ã«ãªãã¾ããæå¾ã®å¼æ°ã¯ãã¡ã¤ã«åã§ããã
<input type="file">ã®å ´åãé常ã¯ã¦ã¼ã¶ã®ãã¡ã¤ã«ã·ã¹ãã ããã¨ããã¾ãã
ä»ã®ã¡ã½ããã¯æ¬¡ã®ã¨ããã§ã:
formData.delete(name)formData.get(name)formData.has(name)
以ä¸ã§ã!
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã