è¿ä¸ç« æ¯å ³äºåé HTML 表åçï¼å¸¦ææä¸å¸¦æä»¶ï¼å¸¦æå ¶ä»å段çã
FormData 对象å¯ä»¥æä¾å¸®å©ãä½ å¯è½å·²ç»çå°äºï¼å®æ¯è¡¨ç¤º HTML è¡¨åæ°æ®ç对象ã
æé 彿°æ¯ï¼
let formData = new FormData([form]);
妿æä¾äº HTML form å
ç´ ï¼å®ä¼èªå¨æè· form å
ç´ åæ®µã
FormData çç¹æ®ä¹å¤å¨äºç½ç»æ¹æ³ï¼network methodsï¼ï¼ä¾å¦ fetch å¯ä»¥æ¥åä¸ä¸ª FormData 对象ä½ä¸º bodyãå®ä¼è¢«ç¼ç å¹¶åéåºå»ï¼å¸¦æ Content-Type: multipart/form-dataã
仿å¡å¨è§åº¦æ¥çï¼å®å°±åæ¯ä¸ä¸ªæ®éç表åæäº¤ã
åéä¸ä¸ªç®åç表å
æä»¬å æ¥åéä¸ä¸ªç®åç表åã
æ£å¦ä½ æçå°çï¼å®å ä¹å°±æ¯ä¸è¡ä»£ç ï¼
<form id="formElem">
<input type="text" name="name" value="John">
<input type="text" name="surname" value="Smith">
<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 请æ±å¹¶ååº âUser savedâã
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 å°ä¼æ·»å å¤ä¸ªå
·æç¸ååç§°çåæ®µã
è¿æä¸ä¸ª set æ¹æ³ï¼è¯æ³ä¸ append ç¸åãä¸åä¹å¤å¨äº .set ç§»é¤ææå
·æç»å® name çåæ®µï¼ç¶åéå ä¸ä¸ªæ°å段ãå æ¤ï¼å®ç¡®ä¿äºåªæä¸ä¸ªå
·æè¿ç§ name çåæ®µï¼å
¶ä»çå append 䏿 ·ï¼
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ï¼ç¶åæ¯ key2 = value2
}
åé带ææä»¶ç表å
表åå§ç»ä»¥ Content-Type: multipart/form-data æ¥åéæ°æ®ï¼è¿ä¸ªç¼ç å
许åéæä»¶ãå æ¤ <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 åéä¸ä¸ªå¨æçæçäºè¿å¶æ°æ®ï¼ä¾å¦å¾çï¼æ¯å¾ç®åçãæä»¬å¯ä»¥ç´æ¥å°å
¶ä½ä¸º fetch åæ°ç bodyã
ä½å¨å®é ä¸ï¼éå¸¸æ´æ¹ä¾¿çåéå¾ççæ¹å¼ä¸æ¯åç¬åéï¼èæ¯å°å ¶ä½ä¸ºè¡¨åçä¸é¨åï¼å¹¶å¸¦æéå åæ®µï¼ä¾å¦ ânameâ åå ¶ä» metadataï¼ä¸èµ·åéã
å¹¶ä¸ï¼æå¡å¨é常æ´é忥æ¶å¤é¨åç¼ç ç表åï¼multipart-encoded formï¼ï¼è䏿¯åå§çäºè¿å¶æ°æ®ã
ä¸é¢è¿ä¸ªä¾åä½¿ç¨ 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"> 䏿 ·ï¼ç¨æ·ä»ä»ä»¬çæä»¶ç³»ç»ä¸ä½¿ç¨æ°æ® imageBlobï¼ç¬¬äºä¸ªåæ°ï¼æäº¤äºä¸ä¸ªå为 image.pngï¼ç¬¬ä¸ä¸ªåæ°ï¼çæä»¶ã
æå¡å¨è¯»åè¡¨åæ°æ®åæä»¶ï¼å°±å¥½å宿¯å¸¸è§ç表åæäº¤ä¸æ ·ã
æ»ç»
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)
让æä»¬å¨è¿é注æä¸¤ä¸ªç¹ç¹ï¼
setæ¹æ³ä¼ç§»é¤å ·æç¸ååç§°ï¼nameï¼çåæ®µï¼èappendä¸ä¼ã- è¦åéæä»¶ï¼éè¦ä½¿ç¨ä¸ä¸ªåæ°çè¯æ³ï¼æåä¸ä¸ªåæ°æ¯æä»¶åï¼ä¸è¬æ¯éè¿
<input type="file">ä»ç¨æ·æä»¶ç³»ç»ä¸è·åçã
å ¶ä»æ¹æ³æ¯ï¼
formData.delete(name)formData.get(name)formData.has(name)
è¿å°±æ¯å®çå ¨è²ï¼
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼