Contoh multipart / form-data


103

Saya ingin tahu apakah ada yang bisa membagikan kepada saya contoh multipart / form-data yang berisi:

  1. Beberapa parameter bentuk
  2. Banyak file

2
Buka di sini: w3.org/TR/html401/interact/forms.html#h-17.13.4 Di dalamnya17.13.4 Form content types Anda akan menemukan apa yang Anda cari.
Andrew Barber



Unggahan multi bagian mengunggah file besar demi bagian. Unggahan multifile mengunggah banyak file kecil. Apa yang kamu tanyakan?
Gangnus

Jawaban:


126

EDIT : Saya mempertahankan jawaban yang serupa, tetapi lebih mendalam di: https://stackoverflow.com/a/28380690/895245

Untuk melihat dengan tepat apa yang terjadi, gunakan nc -latau server ECHO dan agen pengguna seperti browser atau cURL.

Simpan formulir ke .htmlfile:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text" value="text default">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><button type="submit">Submit</button>
</form>

Buat file untuk diunggah:

echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html

Lari:

nc -l localhost 8000

Buka HTML di browser Anda, pilih file dan klik kirim dan periksa terminal.

ncmencetak permintaan yang diterima. Firefox mengirim:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266
Content-Length: 554

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="text"

text default
-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>

-----------------------------9051914041544843365972754266--

Secara internasional, cURL harus mengirim permintaan POST yang sama dengan formulir browser Anda:

nc -l localhost 8000
curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000

Anda dapat melakukan beberapa tes dengan:

while true; do printf '' | nc -l localhost 8000; done

41
Hal-hal yang menjengkelkan dan tidak segera terlihat: boundary=---------------------------9051914041544843365972754266adalah dua tanda hubung lebih pendek dari batas sebenarnya dalam data. Ini sangat, sangat sulit untuk dilihat dengan semua tanda hubung dirangkai.
Nama Palsu

1
curl --trace-ascii <logfilename> ..... juga berguna untuk melihat data yang dikirim dan diterima.
Craig Hicks

curl -trace <logfilename> ....juga akan menampilkan biner. Berguna untuk mengamati <LF> vs <CR> <LF>.
Craig Hicks

@FakeName - Batas itu secara otomatis dibuat oleh curl.
Craig Hicks

6
batas selalu - lebih pendek. Setiap pemisah bagian MIME (batas) berisi dua tanda pisah tambahan di depan dan pemisah batas tambahan berisi empat tanda pisah tambahan: dua di depan dan dua di ujung.
Sergey Kuznetsov

24

Terima kasih banyak atas jawaban @Ciro Santilli! Saya menemukan bahwa pilihannya untuk batas cukup "tidak menyenangkan" karena semua tanda hubung tersebut: sebenarnya, seperti yang dikomentari oleh @Fake Name, saat Anda menggunakan permintaan batas dalam, ia akan dilengkapi dengan dua tanda hubung lagi di depan:

Contoh:

POST / HTTP/1.1
HOST: host.example.com
Cookie: some_cookies...
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text that you wrote in your html form ...
--12345
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz"

content of filename.xyz that you upload in your form with input[type=file]
--12345
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg"

content of picture_of_sunset.jpg ...
--12345--

Saya menemukan di halaman w3.org ini yang memungkinkan untuk memasukkan header multipart / campuran dalam multipart / form-data, cukup memilih string batas lain di dalam multipart / campuran dan menggunakan yang satu itu untuk memasukkan data. Pada akhirnya, Anda harus "menutup" semua batas yang digunakan di FILO untuk menutup permintaan POST (seperti:

POST / HTTP/1.1
...
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text sent via post...
--12345
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=abcde

--abcde
Content-Disposition: file; file="picture.jpg"

content of jpg...
--abcde
Content-Disposition: file; file="test.py"

content of test.py file ....
--abcde--
--12345--

Lihat tautan di atas.


1
Mengapa Anda tidak memisahkan semua properti Content-Dispositiondengan ;?
kelin

1
'> e <ncapsulate'
Craig Hicks
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.