У ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¹Ð´ÐµÑÑÑÑ Ð¿Ñо вÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ HTML-ÑоÑм: з Ñайлами Ñа без, з додаÑковими полÑми й Ñак далÑ.
ÐбâÑкÑи FormData допоможÑÑÑ Ð½Ð°Ð¼ Ñз Ñим. Як ви, напевно, здогадалиÑÑ Ð·Ð° назвоÑ, Ñе обâÑкÑ, Ñо пÑедÑÑавлÑÑ Ð´Ð°Ð½Ñ HTML ÑоÑми.
ÐонÑÑÑÑкÑоÑ:
let formData = new FormData([form]);
ЯкÑо пеÑедаÑи в конÑÑÑÑкÑÐ¾Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ HTML-ÑоÑми form, Ñо обâÑкÑ, Ñо ÑÑвоÑÑÑÑÑÑÑ, авÑомаÑиÑно пÑоÑиÑÐ°Ñ Ð· Ð½ÐµÑ Ð¿Ð¾Ð»Ñ.
Ðого оÑобливÑÑÑÑ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо меÑоди Ð´Ð»Ñ ÑобоÑи з меÑежеÑ, напÑиклад, fetch, дозволÑÑÑÑ Ð²ÐºÐ°Ð·Ð°Ñи обâÑÐºÑ FormData Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ ÑÑла запиÑÑ body.
ТобÑо Ð´Ð»Ñ ÑеÑвеÑа Ñе виглÑÐ´Ð°Ñ Ñк звиÑайне надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÑоÑми.
ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÑоÑÑÐ¾Ñ ÑоÑми
ÐавайÑе ÑпоÑаÑÐºÑ Ð½Ð°Ð´ÑÑлемо пÑоÑÑÑ ÑоÑмÑ.
Як ви баÑиÑе, код дÑже компакÑний:
<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).
ÐÐ¾Ð»Ñ Ð¾Ð±âÑкÑа formData можна пеÑебиÑаÑи, викоÑиÑÑовÑÑÑи Ñикл for..of:
let formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');
// СпиÑок Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑеннÑ
for(let [name, value] of formData) {
alert(`${name} = ${value}`); // key1 = value1, then key2 = value2
}
ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ ÑоÑми з Ñайлом
ÐбâÑкÑи FormData завжди поÑилаÑÑÑÑÑ Ñз заголовком 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.
Ðле на пÑакÑиÑÑ Ð±ÑÐ²Ð°Ñ Ð·ÑÑÑнÑÑе вÑдпÑавлÑÑи зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ окÑемо, а Ñ ÑÐºÐ»Ð°Ð´Ñ ÑоÑми, додавÑи додаÑÐºÐ¾Ð²Ñ Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ ÑÐ¼ÐµÐ½Ñ Ñа ÑнÑÑ Ð¼ÐµÑаданÑ.
ÐÑÑм Ñого, ÑеÑвеÑи ÑаÑÑо налаÑÑÐ¾Ð²Ð°Ð½Ñ Ð½Ð° пÑÐ¸Ð¹Ð¼Ð°Ð½Ð½Ñ Ñаме ÑоÑм, а не пÑоÑÑо бÑнаÑÐ½Ð¸Ñ Ð´Ð°Ð½Ð¸Ñ .
У пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе надÑилаÑÑÑÑÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð· <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" (3й аÑгÑменÑ) Ñа даними imageBlob (2й аÑгÑменÑ) Ð·Ñ ÑвоÑÑ ÑÐ°Ð¹Ð»Ð¾Ð²Ð¾Ñ ÑиÑÑеми.
СеÑÐ²ÐµÑ Ð¿ÑоÑиÑÐ°Ñ Ñ Ð´Ð°Ð½Ñ Ñ Ñайл, Ñак Ñамо, Ñкби Ñе бÑла звиÑайна вÑдпÑавка ÑоÑми.
ÐÑдÑÑмки
ÐбâÑкÑи 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видалÑÑ Ð¿Ð¾Ð»Ñ Ð· Ñаким Ñамим Ñменем, аappendâ нÑ. У ÑÑÐ¾Ð¼Ñ ÑÑ Ð½Ñ Ñдина вÑдмÑннÑÑÑÑ. - Щоб надÑÑлаÑи Ñайл, поÑÑÑбно викоÑиÑÑовÑваÑи ÑинÑакÑÐ¸Ñ Ð· ÑÑÑома аÑгÑменÑами, Ñк ÑÑеÑÑй вказÑÑÑÑÑÑ ÑмâÑ ÑайлÑ, Ñке зазвиÑай, пÑи
<input type="file">, беÑеÑÑÑÑ Ð· ÑÐ°Ð¹Ð»Ð¾Ð²Ð¾Ñ ÑиÑÑеми.
ÐнÑÑ Ð¼ÐµÑоди:
formData.delete(name)formData.get(name)formData.has(name)
ÐÑ Ñ Ð²Ñе!
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)