Що означає enctype='multipart/form-data'?
Що означає enctype='multipart/form-data'
в HTML-формі і коли його потрібно використовувати?
1281
3
Що означає enctype='multipart/form-data'
в HTML-формі і коли його потрібно використовувати?
Коли ви робите POST-запит, вам доводиться якимось чином кодувати дані, які формують тіло запиту.
HTML-форми надають три способи кодування.
application/x-www-form-urlencoded
(за замовчуванням)multipart/form-data
(за замовчуванням)text/plain
(за замовчуванням)Велася робота над додаванням
application/json
, але від цього відмовилися.(Інші кодування можливі для HTTP-запитів, що генеруються за допомогою інших засобів, ніж подання HTML-форми).
Специфіка форматів не має значення для більшості розробників. Важливими є наступні моменти:
text/plain
.При написанні клієнтського коду:
multipart/form-data
, якщо ваша форма містить будь-які елементи<input type="file">
multipart/form-data
абоapplication/x-www-form-urlencoded
, алеapplication/x-www-form-urlencoded
буде більш ефективнимПри написанні серверного коду:
Більшість з них (наприклад, Perl's
CGI->param
або та, що виставляється суперглобальною функцією PHP$_POST
) подбає про відмінності за вас. Не намагайтеся розбирати необроблені дані, отримані сервером.Іноді ви знайдете бібліотеку, яка не може обробляти обидва формати. Найпопулярнішою бібліотекою Node.js для обробки даних форм є body-parser, яка не може обробляти багатокомпонентні запити (але має документацію, яка рекомендує деякі альтернативи, які можуть).
Якщо ви пишете (або налагоджуєте) бібліотеку для розбору або генерації вихідних даних, то вам потрібно почати турбуватися про формат. Можливо, ви також захочете дізнатися про нього заради інтересу.
application/x-www-form-urlencoded
- це більш-менш те ж саме, що і рядок запиту в кінці URL-адреси.multipart/form-data
значно складніший, але дозволяє включати в дані цілі файли. Приклад результату можна знайти в специфікації HTML 4.text/plain
введений HTML 5 і корисний тільки для налагодження - з the specification: They are not reliably interpretable by computer - і я б стверджував, що інші в поєднанні з інструментами (на кшталт вкладки Net в інструментах розробника більшості браузерів) є кращими для цього).enctype='multipart/form-data
- це тип кодування, який дозволяє відправляти файли через POST. Простіше кажучи, без цього кодування файли не можуть бути відправлені через POST.Якщо ви хочете дозволити користувачеві завантажити файл через форму, ви повинні використовувати цей enctype.
Відправляючи форму, ви вказуєте своєму браузеру відправити по протоколу HTTP повідомлення по мережі, належним чином упаковане в структуру повідомлення протоколу TCP/IP. HTML-сторінка має спосіб відправки даних на сервер: за допомогою ``s.
При заповненні форми створюється і відправляється на сервер HTTP-запит, повідомлення якого буде містити імена полів у формі і значення, заповнені користувачем. Ця передача може відбуватися методами
POST
абоGET
HTTP.POST
вказує вашому браузеру створити HTTP-повідомлення і помістити весь вміст в тіло повідомлення (дуже корисний спосіб роботи, більш безпечний, а також гнучкий).GET
передасть дані форми в рядку запиту. Він має деякі обмеження щодо представлення та довжини даних.Вказівка способу відправки форми на сервер
Атрибут
enctype
має сенс тільки при використанні методуPOST
. Коли він вказаний, він дає вказівку браузеру відправити форму, закодувавши її вміст певним чином. З MDN - Енктіп форми:application/x-www-form-urlencoded
: Це значення за замовчуванням. При відправці форми збираються всі імена і значення і виконується URL Encoding над кінцевим рядком.multipart/form-data
: Символи НЕ кодуються. Це важливо, коли форма має контроль завантаження файлу. Ви хочете відправити файл у двійковому вигляді, і це гарантує, що бітовий потік не буде змінено.text/plain
: Пробіли конвертуються, але кодування більше не виконується.Безпека
При надсиланні форм можуть виникнути деякі проблеми з безпекою, як зазначено в RFC 7578 Розділ 7: Дані багатокомпонентних форм - міркування щодо безпеки:
Це стосується вас, якщо ви розробник і ваш сервер буде обробляти форми, надіслані користувачами, які можуть містити конфіденційну інформацію.