Що означає 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 - Енктіп форми:
Коли значенням атрибута методу є post, enctype - це MIME тип вмісту, який використовується для передачі форми на сервер.
application/x-www-form-urlencoded
: Це значення за замовчуванням. При відправці форми збираються всі імена і значення і виконується URL Encoding над кінцевим рядком.multipart/form-data
: Символи НЕ кодуються. Це важливо, коли форма має контроль завантаження файлу. Ви хочете відправити файл у двійковому вигляді, і це гарантує, що бітовий потік не буде змінено.text/plain
: Пробіли конвертуються, але кодування більше не виконується.При надсиланні форм можуть виникнути деякі проблеми з безпекою, як зазначено в RFC 7578 Розділ 7: Дані багатокомпонентних форм - міркування щодо безпеки:
Все програмне забезпечення для обробки форм повинно обробляти дані форми, надані користувачем з чутливістю, оскільки вони часто містять конфіденційну або персональну інформацію. інформацію, що ідентифікує особу. Широко використовується функція автозаповнення форм; у веб-браузерах; вони можуть бути використані для того, щоб обманом змусити користувачів несвідомо надсилати конфіденційну інформацію при виконанні інших, здавалося б, нешкідливих завдань нешкідливі завдання. мультичастинні/форма-дані не надають жодних функцій для перевірки цілісності, забезпечення конфіденційності, уникнення плутанини користувача плутанини користувача або інших функцій безпеки; ці проблеми повинні бути вирішуються програмами для заповнення форм та інтерпретації даних форм. Додатки, які отримують форми та інтерпретують дані; Додатки, які отримують форми та обробляють їх, повинні бути обережними не надавати дані назад на сайт, що запитує обробку форм, які не призначалися для відправки. Це може призвести до помилкових даних; Важливо при інтерпретації імені файлу Контенту - поля заголовка Disposition, щоб ненавмисно не перезаписати файли в папці файловому просторі одержувача.
Це стосується вас, якщо ви розробник і ваш сервер буде обробляти форми, надіслані користувачами, які можуть містити конфіденційну інформацію.