Jaka jest granica danych wieloczęściowych / formularzy?

403

Chcę zadać pytanie dotyczące multipart/form-data. W nagłówku HTTP stwierdzam, żeContent-Type: multipart/form-data; boundary=??? .

Czy użytkownik ???może zdefiniować swobodę? Czy jest generowany z HTML? Czy mogę zdefiniować ??? = abcdefg?

pytania
źródło
2
Znalazłem, że to odpowiedź. w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Pytania

Odpowiedzi:

424

Czy użytkownik ???może zdefiniować swobodę?

Tak.

czy jest dostarczany przez HTML?

Nie. HTML nie ma z tym nic wspólnego. Czytaj poniżej.

Czy mogę zdefiniować ???jako abcdefg?

Tak.

Jeśli chcesz wysłać następujące dane do serwera internetowego:

name = John
age = 12

użycie application/x-www-form-urlencodedbyłoby takie:

name=John&age=12

Jak widać, serwer wie, że parametry są oddzielone znakiem ampersand &. Gdyby& jest to wymagane dla wartości parametru, należy ją zakodować.

Skąd więc serwer wie, gdzie wartość parametru zaczyna się i kończy, gdy odbierze żądanie HTTP za pomocą multipart/form-data?

Korzystanie z granicy , podobnie jak &.

Na przykład:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

W takim przypadku wartością graniczną jest XXX. Podajesz go w Content-Typenagłówku, aby serwer wiedział, jak podzielić otrzymane dane.

Musisz więc:

  • Użyj wartości, która nie pojawi się w danych HTTP wysyłanych do serwera.

  • Zachowaj spójność i używaj tej samej wartości wszędzie w komunikacie żądania.

Oscar Mederos
źródło
54
Musisz dodać dodatkowe „-” na końcu granicy.
Sebastian Piskorski
13
Możesz to przeczytać w dokumentacji. Zakończenie granicy musi mieć dodatkowe dwa znaki „”: „Link: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski
6
Świetna odpowiedź. Granica jest tylko „kluczem” do oddzielenia wielu „części” ładunku wieloczęściowego. Zwykle coś takiego jak „&” wystarcza do oddzielenia zmiennych, ale potrzebujesz czegoś bardziej unikalnego, aby oddzielić ładunki w ładunku.
user2483724
1
@ K3rnel31 Oczywiście, chyba że nowy ciąg graniczny ma taką samą długość.
Oscar Mederos
5
Myślę, że wartość graniczna zadeklarowana w nagłówku Content-Type będzie w rzeczywistości -XXX ---, ponieważ podczas oddzielania części należy zapisać dodatkowe „-” (stąd --- XXX ---)
Theodore K ,
96

Dokładna odpowiedź na pytanie brzmi: tak, możesz użyć dowolnej wartości dlaboundary parametru , pod warunkiem , że nie przekracza on 70 bajtów i składa się tylko z 7-bitowychUS-ASCII (drukowalnych) znaków.

Jeśli używasz jednego z multipart/*typów treści, tak naprawdę jest potrzebne , aby określić boundaryparametr w Content-Typenagłówku, w przeciwnym razie serwer (w przypadku żądania HTTP) nie będzie w stanie analizować ładunek.

Prawdopodobnie chcesz również ustawić charsetparametr UTF-8w swoimContent-Type nagłówku, chyba że masz absolutną pewność, że US-ASCIIw danych danych użytych zostanie tylko znaków.

Kilka istotnych fragmentów z RFC2046 :

  • 4.1.2 Parametr zestawu znaków:

    W przeciwieństwie do niektórych innych wartości parametrów, w wartościach parametru charset NIE rozróżnia się wielkości liter. Domyślny zestaw znaków, który należy przyjąć przy braku parametru zestawu znaków, to US-ASCII.

  • 5.1 Typ nośnika wieloczęściowego

    Jak podano w definicji pola Content-Transfer-Encoding [RFC 2045], kodowanie inne niż „7bit”, „8bit” lub „binarny” jest niedozwolone dla jednostek typu „multipart”. „Wieloczęściowe” ograniczniki granic i pola nagłówka są zawsze reprezentowane jako 7-bitowe US-ASCII w każdym przypadku (chociaż pola nagłówka mogą kodować tekst nagłówka spoza US-ASCII zgodnie z RFC 2047), a dane w częściach ciała mogą być kodowane na część po części, z polami Content-Transfer-Encoding dla każdej odpowiedniej części ciała.

    Pole typu treści dla jednostek wieloczęściowych wymaga jednego parametru, „granicy”. Linia ogranicznika granicy jest następnie definiowana jako linia składająca się w całości z dwóch znaków łącznika („-”, wartość dziesiętna 45), po których następuje wartość parametru granicy z pola nagłówka Content-Type, opcjonalne białe spacje liniowe i kończący CRLF.

    Ograniczniki granic nie mogą pojawiać się w zamkniętym materiale i nie mogą być dłuższe niż 70 znaków, nie licząc dwóch wiodących łączników.

    Granica linii ograniczającej po ostatniej części ciała jest wyróżniającym ogranicznikiem, który wskazuje, że nie będą następować dalsze części ciała. Taka linia separatora jest identyczna z poprzednimi liniami separatora, z dodanymi dwoma dodatkowymi myślnikami po wartości parametru granicy.

Oto przykład z dowolną granicą:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--
antychris
źródło
2
Najbardziej podoba mi się ta odpowiedź, ponieważ cytaty z RFC na temat tego, jak określone są łączniki .
Rick
@Rick Istnieje uzasadniony powód, aby IETF to zrobił - chociaż wszystkie wyglądają prawie tak samo, tylko jedna z następujących czterech jest poprawnym znakiem łącznika: ˗ - - -
antichris
ha, kiedy powiedziałem hipensy, mam na myśli twoją odpowiedź, która hipoteza jest zdefiniowana w standardzie. Byłem zdezorientowany, które hipogi są „zdefiniowane przez klienta”, a które „zdefiniowane przez specyfikację”
Rick
31

multipart / form-data zawiera granicę dla oddzielnych par nazwa / wartość. Granica działa jak znacznik każdej porcji par nazwa / wartość przekazywanych po przesłaniu formularza. Granica jest automatycznie dodawana do typu treści nagłówka żądania.

Formularz z atrybutem enctype = "multipart / form-data" będzie miał nagłówek żądania Content-Type: multipart / form-data; granica --- WebKit193844043-h (wartość generowana przez przeglądarkę ).

Przekazany ładunek wygląda mniej więcej tak:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

Po stronie usługi jest on wykorzystywany w postaci @Consumes („multipart / form-data”).

Uwaga: podczas testowania usługi internetowej przy użyciu listonosza chrome należy zaznaczyć opcję danych formularza (przycisk radiowy) i menu Plik w menu rozwijanym, aby wysłać załącznik. Jawne udostępnianie typu zawartości jako danych wieloczęściowych / formularzy powoduje błąd. Ponieważ brakuje granicy, ponieważ zastępuje ona żądanie zawinięcia post man do serwera z typem zawartości, dodając granicę, która działa dobrze.

Patrz RFC1341, sekcja 7.2 Wieloczęściowy typ zawartości

Yergalem
źródło