Apa batas dalam multipart / form-data?

403

Saya ingin bertanya tentang multipart/form-data. Di header HTTP, saya menemukan bahwa Content-Type: multipart/form-data; boundary=???.

Apakah ???kebebasan ditentukan oleh pengguna? Atau itu dihasilkan dari HTML? Apakah mungkin bagi saya untuk mendefinisikannya ??? = abcdefg?

Pertanyaan
sumber

Jawaban:

424

Apakah ???kebebasan ditentukan oleh pengguna?

Iya.

atau disediakan oleh HTML?

No HTML memiliki apa-apa hubungannya dengan itu. Baca di bawah.

Apakah mungkin bagi saya untuk mendefinisikan ???sebagai abcdefg?

Iya.

Jika Anda ingin mengirim data berikut ke server web:

name = John
age = 12

menggunakan application/x-www-form-urlencodedakan seperti ini:

name=John&age=12

Seperti yang Anda lihat, server tahu bahwa parameter dipisahkan oleh ampersand &. Jika& diperlukan untuk nilai parameter maka harus dikodekan.

Jadi, bagaimana server tahu di mana nilai parameter dimulai dan berakhir ketika menerima permintaan HTTP menggunakan multipart/form-data?

Menggunakan batas , mirip dengan &.

Sebagai contoh:

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

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

12
--XXX--

Dalam hal ini, nilai batasnya adalah XXX. Anda menentukannya di Content-Typeheader sehingga server tahu cara membagi data yang diterimanya.

Jadi, Anda perlu:

  • Gunakan nilai yang tidak akan muncul dalam data HTTP yang dikirim ke server.

  • Konsisten dan gunakan nilai yang sama di mana saja dalam pesan permintaan.

Oscar Mederos
sumber
54
Anda harus menambahkan "-" tambahan di akhir batas.
Sebastian Piskorski
13
Anda dapat membacanya dalam dokumentasi. Batas akhir harus memiliki dua tambahan hypens "-" Tautan: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski
6
Jawaban yang bagus Batas hanyalah 'kunci' untuk memisahkan beberapa "bagian" dari muatan multi bagian. Biasanya sesuatu seperti '&' sudah cukup untuk memisahkan variabel tetapi Anda perlu sesuatu yang lebih unik untuk memisahkan muatan dalam muatan.
user2483724
1
@ K3rnel31 Tentu saja, kecuali jika string batas baru memiliki panjang yang sama.
Oscar Mederos
5
Saya berpikir bahwa nilai batas seperti yang dinyatakan dalam header Tipe-Konten sebenarnya akan -XXX --- karena "-" tambahan harus ditulis ketika memisahkan bagian (maka --- XXX ---)
Theodore K .
96

Jawaban tepat untuk pertanyaan adalah: ya, Anda dapat menggunakan nilai arbitrer untuk boundaryparameter , mengingat parameter tidak melebihi panjang 70 byte dan hanya terdiri dari karakter 7-bitUS-ASCII (dapat dicetak).

Jika Anda menggunakan salah satu multipart/*jenis konten, Anda sebenarnya harus menentukan boundaryparameter di Content-Typeheader, jika tidak server (dalam hal permintaan HTTP) tidak akan dapat mengurai muatan.

Anda mungkin juga ingin mengatur charsetparameter ke UTF-8dalam Content-Typeheader Anda , kecuali Anda dapat benar - benar yakin bahwa hanya US-ASCIIrangkaian karakter yang akan digunakan dalam data payload.

Beberapa kutipan yang relevan dari RFC2046 :

  • 4.1.2. Parameter Charset:

    Tidak seperti beberapa nilai parameter lainnya, nilai-nilai parameter charset TIDAK peka huruf besar-kecil. Set karakter default, yang harus diasumsikan dengan tidak adanya parameter charset, adalah US-ASCII.

  • 5.1. Jenis Media Multipart

    Sebagaimana dinyatakan dalam definisi bidang Content-Transfer-Encoding [RFC 2045], tidak ada pengkodean selain "7bit", "8bit", atau "binary" yang diizinkan untuk entitas dengan tipe "multipart". Pembatas batas "multipart" dan bidang tajuk selalu direpresentasikan sebagai 7bit US-ASCII dalam hal apa pun (meskipun bidang tajuk dapat menyandikan teks tajuk bukan-AS-ASCII sesuai RFC 2047) dan data dalam bagian tubuh dapat dikodekan pada sebuah bagian demi bagian, dengan bidang Content-Transfer-Encoding untuk setiap bagian tubuh yang sesuai.

    Bidang Tipe Konten untuk entitas multi bagian memerlukan satu parameter, "batas". Garis pembatas batas kemudian didefinisikan sebagai garis yang seluruhnya terdiri dari dua karakter tanda hubung ("-", nilai desimal 45) diikuti oleh nilai parameter batas dari bidang header Tipe-Konten, spasi putih linear opsional, dan CRLF yang diakhiri.

    Pembatas batas tidak boleh muncul dalam bahan yang dienkapsulasi, dan harus tidak lebih dari 70 karakter, tidak termasuk dua tanda hubung utama.

    Garis pembatas batas yang mengikuti bagian tubuh terakhir adalah pembatas yang dibedakan yang menunjukkan bahwa tidak ada bagian tubuh selanjutnya yang akan mengikuti. Garis pembatas seperti itu identik dengan garis pembatas sebelumnya, dengan penambahan dua tanda hubung setelah nilai parameter batas.

Berikut adalah contoh menggunakan batas arbitrer:

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--
antikris
sumber
2
Saya paling suka jawaban ini karena mengutip dari RFC tentang bagaimana tanda hubung ditentukan.
Rick
@ Rick Ada alasan yang sah untuk IETF untuk melakukan itu - walaupun mereka semua terlihat hampir sama, hanya satu dari empat berikut adalah karakter tanda hubung yang benar: ˗ - - -
antichris
ha, ketika saya mengatakan hypens, maksud saya jawaban Anda mengatakan kepada saya hypens mana yang didefinisikan dalam standar. Saya bingung tentang hipens mana yang "ditentukan klien" dan mana "spesifikasi yang ditentukan"
Rick
31

multipart / form-data berisi batas untuk memisahkan pasangan nama / nilai. Batas bertindak seperti penanda setiap potongan pasangan nama / nilai yang disahkan ketika suatu formulir dikirimkan. Batas secara otomatis ditambahkan ke jenis konten tajuk permintaan.

Formulir dengan atribut enctype = "multipart / form-data" akan memiliki header permintaan Content-Type: multipart / form-data; batas --- WebKit193844043-h ( browser menghasilkan vaue ).

Payload yang dilewati terlihat seperti ini:

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--

Di sisi layanan web, ia dikonsumsi dalam bentuk @Consumes ("multipart / form-data").

Hati-hati, saat menguji layanan web Anda menggunakan tukang pos chrome, Anda perlu memeriksa opsi data formulir (tombol radio) dan menu File dari kotak dropdown untuk mengirim lampiran. Penyediaan tipe konten secara eksplisit saat multipart / formulir-data melempar kesalahan. Karena batas tidak ada karena mengabaikan permintaan curl dari post man ke server dengan tipe konten dengan menambahkan batas yang berfungsi dengan baik.

Lihat RFC1341 dt7.2 Jenis-Konten Multipart

Yergalem
sumber