Co oznacza enctype='multipart/form-data'?

Co oznacza enctype='multipart/form-data' w formularzu HTML i kiedy należy go używać?

Rozwiązanie

Kiedy wykonujesz żądanie POST, musisz w jakiś sposób zakodować dane, które tworzą ciało żądania.

Formularze HTML udostępniają trzy metody kodowania.

  • application/x-www-form-urlencoded (domyślnie)
  • multipart/form-data (domyślnie)
  • text/plain.

Trwały prace nad dodaniem application/json, ale zostały one porzucone.

(Inne kodowania są możliwe dla żądań HTTP generowanych przy użyciu innych środków niż formularz HTML).

Specyfika formatów nie ma znaczenia dla większości programistów. Ważne są następujące kwestie:

  • Nigdy nie używaj text/plain.

Kiedy piszesz kod po stronie klienta:

  • użyj multipart/form-data gdy twój formularz zawiera jakiekolwiek elementy <input type="file">.
  • w przeciwnym wypadku możesz użyć multipart/form-data lub application/x-www-form-urlencoded ale application/x-www-form-urlencoded będzie bardziej wydajne

Kiedy piszesz kod po stronie serwera:

  • Użyj wstępnie napisanej biblioteki obsługi formularzy

Większość z nich (jak na przykład Perl's CGI->param lub ta ujawniona przez PHP's $_POST superglobal) zajmie się różnicami za Ciebie. Nie zawracaj sobie głowy próbami parsowania surowych danych wejściowych otrzymywanych przez serwer.

Czasami można znaleźć bibliotekę, która nie radzi sobie z obydwoma formatami. Najpopularniejszą biblioteką Node.js's do obsługi danych z formularzy jest body-parser, która nie radzi sobie z wieloczęściowymi żądaniami (ale ma dokumentację, która poleca kilka alternatyw, które mogą to zrobić).


Jeśli piszesz (lub debugujesz) bibliotekę do parsowania lub generowania surowych danych, wtedy musisz zacząć martwić się o format. Możesz również chcieć wiedzieć o tym dla samego zainteresowania'.

Format application/x-www-form-urlencoded jest mniej więcej tym samym, co ciąg zapytania na końcu adresu URL.

Opcja multipart/form-data jest znacznie bardziej skomplikowana, ale pozwala na dołączanie całych plików do danych. Przykład wyniku można znaleźć w specyfikacji HTML 4.

text/plain jest wprowadzony przez HTML 5 i jest użyteczny tylko do debugowania - z specyfikacji: They are not reliably interpretable by computer - and I'd argue that the others combined with tools (like the Net tab in the developer tools of most browsers) are better for that).

Komentarze (5)

enctype='multipart/form-data` jest typem kodowania, który pozwala na wysyłanie plików przez POST. Mówiąc prościej, bez tego kodowania pliki nie mogą być wysyłane przez POST.

Jeśli chcesz pozwolić użytkownikowi na przesłanie pliku przez formularz, musisz użyć tego enctype.

Komentarze (5)

Wysyłając formularz, każesz swojej przeglądarce wysłać, za pomocą protokołu HTTP, wiadomość w sieci, odpowiednio opakowaną w strukturę wiadomości protokołu TCP/IP. Strona HTML posiada sposób na wysyłanie danych do serwera: poprzez użycie ``s.

Kiedy formularz jest wysyłany, tworzone jest żądanie HTTP i wysyłane do serwera, wiadomość ta będzie zawierała nazwy pól formularza i wartości wypełnione przez użytkownika. Ta transmisja może się odbyć za pomocą metod POST lub GET _HTTP.

  • POST mówi przeglądarce, aby zbudowała wiadomość HTTP i umieściła całą zawartość w treści wiadomości (bardzo użyteczny sposób, bardziej bezpieczny i elastyczny).
  • GET](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) przekaże dane z formularza w querystring. Ma pewne ograniczenia co do reprezentacji danych i długości.

Określenie jak wysłać formularz do serwera

Atrybut enctype ma sens tylko przy użyciu metody POST. Gdy jest określony, instruuje przeglądarkę, aby wysłała formularz kodując jego zawartość w określony sposób. Z MDN - Form enctype:

Gdy wartością atrybutu method jest post, enctype oznacza MIME typem zawartości, która jest używana do przesłania formularza do serwera.

  • application/x-www-form-urlencoded: Jest to wartość domyślna. Kiedy formularz jest wysyłany, wszystkie nazwy i wartości są zbierane i URL Encoding jest wykonywane na końcowym łańcuchu.
  • multipart/form-data: Znaki NIE są kodowane. Jest to ważne, gdy formularz posiada kontrolkę wysyłania plików. Chcesz wysłać plik binarnie i to zapewnia, że strumień bitów nie jest zmieniany.
  • text/plain: Spacje są konwertowane, ale nie jest wykonywane dalsze kodowanie.

Bezpieczeństwo

Podczas wysyłania formularzy mogą pojawić się pewne problemy z bezpieczeństwem, jak podano w RFC 7578 Section 7: Multipart form data - Security considerations:

Całe oprogramowanie przetwarzające formularze powinno traktować dostarczone przez użytkownika form-dane z wrażliwością, ponieważ często zawierają one poufne lub osobiście informacje identyfikujące. Powszechnie stosowane są funkcje "autouzupełniania" formularzy w przeglądarkach internetowych; funkcji > w przeglądarkach internetowych; mogą one być wykorzystywane do oszukiwania użytkowników, aby nieświadomego wysyłania poufnych informacji podczas wypełniania skądinąd niewinnych zadań. nieszkodliwych zadań. multipart/form-data nie dostarcza żadnych funkcji do sprawdzania integralności, zapewniania poufności, unikania pomyłek użytkowników pomyłki użytkownika, lub innych funkcji bezpieczeństwa; te obawy muszą być zaadresowane przez aplikacje do wypełniania formularzy i interpretacji danych.

Aplikacje, które otrzymują formularze i przetwarzają je, muszą być ostrożne aby nie dostarczać z powrotem do witryny przetwarzającej formularze danych, które nie były przeznaczone do wysłania.

Ważne jest przy interpretacji nazwy pliku z nagłówka Content- Disposition header field, aby nie nadpisać przypadkowo plików w > odbiorcy. przestrzeni plików odbiorcy'.

Dotyczy to deweloperów, których serwer będzie przetwarzał formularze przesłane przez użytkowników, które mogą zawierać poufne informacje.

Komentarze (1)