اÛÙ ÙØµÙ در Ù ÙØ±Ø¯ Ø§Ø±Ø³Ø§Ù ÙØ±Ù âÙØ§Û HTML Ø§Ø³ØªØ Ø¨Ø§ ÛØ§ بدÙÙ ÙØ§ÛÙØ با ÙÛÙØ¯ÙØ§Û Ø§Ø¶Ø§ÙÛ Ù ØºÛØ±Ù.
Ø´ÛØ¡ FormData Ù ÛØªÙØ§ÙØ¯ ب٠ش٠ا در اÛ٠ز٠ÛÙÙ Ú©Ù Ú© Ú©ÙÙØ¯. ÙÙ Ø§ÙØ·Ùر ک٠٠٠ک٠است ØØ¯Ø³ Ø²Ø¯Ù Ø¨Ø§Ø´ÛØ¯Ø اÛÙ Ø´ÛØ¡ Ø¨Ø±Ø§Û ÙÙ Ø§ÛØ´ داد٠دادÙâÙØ§Û ÙØ±Ù HTML Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛØ´Ùد.
constructor Ø¨Ù ØµÙØ±Øª Ø²ÛØ± است:
let formData = new FormData([form]);
اگر Ø¹ÙØµØ± ÙØ±Ù
HTML ÙØ¬Ùد داشت٠باشد Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ÙÛÙØ¯ÙØ§Û Ø¢Ù Ø±Ø§ Ú¯Ø±ÙØªÙ Ù Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙØ¯.
ÙÛÚÚ¯Û Ù
ÙÙ
اÛÙک٠از FormData Ù
ØªØ¯ÙØ§Û شبک٠Ù
اÙÙØ¯ 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 را ÙØ¨Ù٠کرد٠٠با پاسخ âکاربر Ø°Ø®ÛØ±Ù شدâ پاسخ Ù ÛØ¯Ùد.
Ù ØªØ¯ÙØ§Û 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');
// List key/value pairs
for(let [name, value] of formData) {
alert(`${name} = ${value}`); // key1 = value1, then 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 آسا٠است. Ù
ÛØªÙاÙÛÙ
آ٠را ب٠عÙÙØ§Ù پاراÙ
تر body Ù
ستÙÛÙ
ا٠با fetch ارسا٠کÙÛÙ
.
در Ø¹Ù Ù Ø§ØºÙØ¨ Ù ÙØ§Ø³Ø¨ØªØ± است ک٠تصÙÛØ± را Ø¨Ù ØµÙØ±Øª جداگاÙÙ ÙÙØ±Ø³ØªÛ٠بÙک٠ب٠عÙÙØ§Ù ÛÚ© ÙØ³Ù ت از ÙØ±Ù با ÙÛÙØ¯ÙØ§Û Ø§Ø¶Ø§ÙÛ Ù Ø§ÙÙØ¯ âÙØ§Ù â ٠دÛگر ÙØ±Ø§Ø¯Ø§Ø¯ÙâÙØ§ Ø¨ÙØ±Ø³ØªÛÙ .
ÙÙ ÚÙÛÙØ Ø³Ø±ÙØ±Ùا ٠ع٠ÙÙØ§Ù Ø¨Ø±Ø§Û Ù¾Ø°ÛØ±Ø´ ÙØ±Ù âÙØ§Û Ø±Ù Ø²Ú¯Ø°Ø§Ø±Û ÚÙØ¯ ÙØ³Ù ØªÛ (multipart-encoded) Ù ÙØ§Ø³Ø¨âتر از Ø¯Ø§Ø¯Ù Ø¯ÙØ¯ÙÛÛ Ø®Ø§Ù ÙØ³ØªÙد.
ÛÚ© Ù
ثا٠از ارسا٠تصÙÛØ±<canvas> ب٠ÙÙ
را٠باÙÛ ÙÛÙØ¯ ÙØ§ در ÙØ§Ùب ÛÚ© ÙØ±Ù
با Ø§Ø³ØªÙØ§Ø¯Ù از FormData:
<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" (آرگÙÙ
ا٠سÙÙ
) را با داد٠imageBlob (آرگÙÙ
ا٠دÙÙ
) از Ø³ÛØ³ØªÙ
Ø®ÙØ¯ Ø§Ø±Ø³Ø§Ù Ú©ÙØ¯.
Ø³Ø±ÙØ± دادÙâÙØ§Û ÙØ±Ù Ù ÙØ§Û٠را Ù ÛâØ®ÙØ§Ùد اÙگار Ú©Ù ÛÚ© Ø§Ø±Ø³Ø§Ù ÙØ±Ù ٠ع٠ÙÙÛ Ø§ÙØ¬Ø§Ù شد٠است.
Ø®ÙØ§ØµÙ
Ø´Û ÙØ§Û FormData Ø¨Ø±Ø§Û Ú¯Ø±ÙØªÙ ÙØ±Ù
HTML ٠ارسا٠آ٠با Ø§Ø³ØªÙØ§Ø¯Ù از fetch ÛØ§ ÛÚ© Ù
تد ÙØ§Û دÛگر Ø´Ø¨Ú©Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙÙØ¯.
Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
ÛØ§ ÛÚ© new FormData(form) Ø¬Ø¯ÛØ¯ از ÛÚ© ÙØ±Ù
HTML Ø§ÛØ¬Ø§Ø¯ Ú©ÙÛÙ
Ø ÛØ§ ÛÚ© Ø´ÛØ¡ بدÙÙ ÙØ±Ù
Ø§ÛØ¬Ø§Ø¯ Ú©ÙÛÙ
٠سپس با Ø§Ø³ØªÙØ§Ø¯Ù از Ù
ØªØ¯ÙØ§ ÙÛÙØ¯Ùا را اضاÙÙ Ú©ÙÛÙ
:
formData.append(name, value)formData.append(name, blob, fileName)formData.set(name, value)formData.set(name, blob, fileName)
ب٠د٠Ùکت٠ÙÛÚ٠در اÛÙØ¬Ø§ ØªÙØ¬Ù Ú©ÙÛØ¯:
- Ù
تد
setÙÛÙØ¯ÙØ§Û Ø¨Ø§ ÙÙ Ø§Ù ÙØ§Ù را ØØ°Ù Ù ÛâÚ©ÙØ¯Ø ا٠اappendاÛÙکار را ÙÙ ÛÚ©ÙØ¯. اÛ٠تÙÙØ§ ØªÙØ§Ùت بÛ٠آÙÙØ§Ø³Øª. - Ø¨Ø±Ø§Û Ø§Ø±Ø³Ø§Ù ÛÚ© ÙØ§ÛÙØ ÙÛØ§Ø² ب٠سÛÙØªÚ©Ø³ با 3 آرگÙÙ
Ø§Ù Ø§Ø³ØªØ Ø¢Ø®Ø±Û٠آرگÙÙ
Ø§Ù ÙØ§Ù
ÙØ§Û٠است Ú©Ù Ø¨Ù Ø·ÙØ± Ù
عÙ
Ù٠از ÙØ§ÛÙ Ø³ÛØ³ØªÙ
کاربر براÛ
<input type="file">Ú¯Ø±ÙØªÙ Ù ÛØ´Ùد.
Ù ØªØ¯ÙØ§Û دÛگر:
formData.delete(name)formData.get(name)formData.has(name)
ک٠داستا٠ÙÙ ÛÙ Ø¨ÙØ¯!
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)