Що означає enctype='multipart/form-data'?

Що означає 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 в інструментах розробника більшості браузерів) є кращими для цього).

Коментарі (5)

enctype='multipart/form-data - це тип кодування, який дозволяє відправляти файли через POST. Простіше кажучи, без цього кодування файли не можуть бути відправлені через POST.

Якщо ви хочете дозволити користувачеві завантажити файл через форму, ви повинні використовувати цей enctype.

Коментарі (5)

Відправляючи форму, ви вказуєте своєму браузеру відправити по протоколу 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, щоб ненавмисно не перезаписати файли в папці файловому просторі одержувача.

Це стосується вас, якщо ви розробник і ваш сервер буде обробляти форми, надіслані користувачами, які можуть містити конфіденційну інформацію.

Коментарі (1)