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
?
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
?
Odpowiedzi:
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ć
???
jakoabcdefg
?
Tak.
Jeśli chcesz wysłać następujące dane do serwera internetowego:
name = John
age = 12
użycie application/x-www-form-urlencoded
był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-Type
nagłó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.
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ć boundary
parametr w Content-Type
nagłówku, w przeciwnym razie serwer (w przypadku żądania HTTP) nie będzie w stanie analizować ładunek.
Prawdopodobnie chcesz również ustawić charset
parametr UTF-8
w swoimContent-Type
nagłówku, chyba że masz absolutną pewność, że US-ASCII
w 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--
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