Apa yang dimaksud dengan enctype='multipart/form-data'
berarti dalam bentuk HTML dan kapan kita harus menggunakannya?
Ketika anda membuat POSTING permintaan, anda harus menyandikan data yang membentuk tubuh dari permintaan dalam beberapa cara.
Bentuk HTML menyediakan tiga metode pengkodean.
application/x-www-form-urlencoded
(default)multipart/form-data
text/plain
Pekerjaan yang sedang dilakukan pada menambahkan application/json
, tetapi yang telah ditinggalkan.
(Pengkodean lainnya yang mungkin dengan permintaan HTTP yang dihasilkan dengan menggunakan cara lain dari penyerahan formulir HTML.)
Spesifikasi format don't peduli untuk sebagian besar pengembang. Poin penting adalah:
text/plain
.Ketika anda menulis kode sisi klien:
multipart/form-data
ketika anda bentuk termasuk <input type="file">
elemenmultipart/form-data
atau application/x-www-form-urlencoded
tapi application/x-www-form-urlencoded
akan lebih efisienKetika anda menulis kode sisi server:
Sebagian besar (seperti Perl's CGI->param
atau orang yang terkena oleh PHP's $_POST
superglobal) akan mengurus perbedaan untuk anda. Don't repot-repot mencoba untuk mengurai raw input yang diterima oleh server.
Kadang-kadang anda akan menemukan perpustakaan yang dapat't menangani kedua format. Node.js's most popular perpustakaan untuk penanganan form data body-parser yang tidak dapat menangani multi permintaan (tetapi memiliki dokumentasi yang merekomendasikan beberapa alternatif yang dapat).
Jika anda menulis (atau debugging) perpustakaan untuk parsing atau menghasilkan data mentah, maka anda perlu mulai khawatir tentang format. Anda mungkin juga ingin tahu tentang hal itu untuk kepentingan's sake.
application/x-www-form-urlencoded
lebih atau kurang sama seperti query string pada akhir URL.
multipart/form-data
adalah secara signifikan lebih rumit tetapi memungkinkan seluruh file yang akan dimasukkan dalam data. Contoh hasilnya dapat ditemukan di HTML 4 keterangan.
text/plain
diperkenalkan oleh HTML 5 dan hanya berguna untuk debugging — dari spec: Mereka tidak andal yang dapat ditafsirkan oleh komputer — dan I'd berpendapat bahwa orang lain dikombinasikan dengan alat-alat (seperti Net tab di alat pengembang dari kebanyakan browser) adalah lebih baik untuk itu).
kapan kita harus menggunakannya
Quentin's jawaban yang benar: gunakan multipart/form-data
jika form ini berisi file upload, dan application/x-www-form-urlencoded
jika tidak, yang merupakan default jika anda mengabaikan enctype
.
I'm akan:
Ada tiga kemungkinan untuk enctype
:
application/x-www-form-urlencoded
multipart/form-data
(spec poin untuk RFC7578)text/plain
. Ini adalah "tidak andal yang dapat ditafsirkan oleh komputer", sehingga tidak boleh digunakan dalam produksi, dan kita tidak akan melihat lebih jauh ke dalamnya.Setelah anda melihat contoh dari masing-masing metode, menjadi jelas bagaimana mereka bekerja, dan kapan anda harus menggunakan masing-masing satu.
Anda dapat menghasilkan contoh-contoh menggunakan:
nc -l
atau GEMA server: https://stackoverflow.com/questions/5725430/http-test-server-accepting-get-post-requests/52351480#52351480Menyimpan formulir yang minimal `.html file:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>upload</title>
</head>
<body>
<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
<p><input type="text" name="text1" value="text default">
<p><input type="text" name="text2" value="aωb">
<p><input type="file" name="file1">
<p><input type="file" name="file2">
<p><input type="file" name="file3">
<p><button type="submit">Submit</button>
</form>
</body>
</html>
Kami menetapkan nilai teks ke aωb
, yang berarti awb
karena ω
adalah U+03C9
, yang adalah byte 61 LIH 89 62
dalam UTF-8.
Membuat file untuk meng-upload:
echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html
# Binary file containing 4 bytes: 'a', 1, 2 and 'b'.
printf 'a\xCF\x89b' > binary
Kami sedikit echo server:
while true; do printf '' | nc -l 8000 localhost; done
Buka HTML pada browser anda, pilih file dan klik submit dan cek terminal.
nc
cetakan permintaan diterima.
Diuji pada: Ubuntu 14.04.3, nc
BSD 1.105, Firefox 40.
Firefox dikirim:
POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150
Content-Length: 834
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text1"
text default
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text2"
aωb
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain
Content of a.txt.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html
<!DOCTYPE html><title>Content of a.html.</title>
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file3"; filename="binary"
Content-Type: application/octet-stream
aωb
-----------------------------735323031399963166993862150--
Untuk file biner dan bidang teks, byte 61 LIH 89 62
(awb
UTF-8) yang dikirim secara harfiah. Anda bisa memverifikasi bahwa dengan nc -l localhost 8000 | hd
, yang mengatakan bahwa byte:
61 CF 89 62
dikirim (61
== 'a' dan 62
== 'b').
Oleh karena itu jelas bahwa:
Content-Type: multipart/form-data; batas=---------------------------9051914041544843365972754266
menetapkan jenis konten untuk multipart/form-data
dan mengatakan bahwa bidang yang dipisahkan oleh batas
string.
setiap bidang menjadi beberapa sub header sebelum data: Content-Disposition: form-data
, kolom nama
, yang filename
, diikuti oleh data.
Server membaca data sampai batas berikutnya string. Browser harus memilih batas yang tidak akan muncul dalam salah satu bidang, jadi ini adalah mengapa batas yang dapat bervariasi antara permintaan.
Karena kami memiliki unik batas, tidak ada encoding dari data-data yang diperlukan: data biner yang dikirim seperti ini.
TODO: apa yang optimal ukuran batas (log(N)
I bet), dan nama / running time dari algoritma yang menemukan hal itu? Tanya: https://cs.stackexchange.com/questions/39687/find-the-shortest-sequence-that-is-not-a-sub-sequence-of-a-set-of-sequences
Content-Type
adalah yang ditentukan secara otomatis oleh browser.Bagaimana hal ini ditentukan secara pasti ditanya di: https://stackoverflow.com/questions/1201945/how-is-mime-type-of-an-uploaded-file-determined-by-browser
Sekarang mengubah enctype
untuk application/x-www-form-urlencoded
, reload browser, dan mengirimkan kembali.
Firefox dikirim:
POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
text1=text+default&text2=a%CF%89b&file1=a.txt&file2=a.html&file3=binary
Jelas file data tidak dikirim, hanya basenames. Jadi ini tidak dapat digunakan untuk file.
Sedangkan untuk bidang teks, kita lihat yang biasa cetak karakter a
dan b
yang dikirim dalam satu byte, sedangkan non-cetak seperti 0xCF
dan 0x89
mengambil 3 byte masing-masing: %CF%89
!
Upload File yang sering mengandung banyak karakter non-printable (misalnya gambar), sedangkan teks bentuk yang hampir tidak pernah dilakukan.
Dari contoh-contoh yang telah kita lihat bahwa:
multipart/form-data
: menambahkan beberapa byte dari batas overhead untuk pesan, dan harus menghabiskan beberapa waktu untuk menghitung, tetapi mengirimkan setiap byte dalam satu byte.
application/x-www-form-urlencoded
: memiliki satu byte batas per bidang (&
), tetapi menambahkan linear overhead faktor 3x untuk setiap non-cetak karakter.
Oleh karena itu, bahkan jika kita bisa mengirim file dengan application/x-www-form-urlencoded
, kita tidak't ingin, karena hal ini sangat tidak efisien.
Tapi untuk karakter yang dapat dicetak ditemukan dalam bidang teks, itu tidak masalah dan menghasilkan lebih sedikit overhead, jadi kita gunakan saja itu.
enctype='multipart/form-data
adalah jenis pengkodean yang memungkinkan file yang akan dikirim melalui POST. Cukup sederhana, tanpa encoding file yang tidak dapat dikirimkan melalui POST.
Jika anda ingin memungkinkan pengguna untuk meng-upload file melalui formulir, anda harus menggunakan ini enctype.
Ketika mengirimkan formulir, anda memberitahu browser anda untuk mengirim, melalui protokol HTTP, pesan pada jaringan, benar diselimuti TCP/IP protokol pesan struktur. Sebuah halaman HTML memiliki sebuah cara untuk mengirim data ke server: dengan menggunakan <form>
s.
Bila formulir dikirimkan, Permintaan HTTP jika dibuat dan dikirim ke server, pesan ini akan berisi nama field dalam bentuk dan nilai-nilai yang diisi oleh pengguna. Penularan ini dapat terjadi dengan POST
atau MENDAPATKAN
HTTP methods.
POST
memberitahu browser anda untuk membangun sebuah pesan HTTP dan menempatkan semua konten dalam tubuh pesan (cara yang sangat berguna untuk melakukan hal-hal, lebih aman dan juga fleksibel).AMBIL
akan mengirimkan data formulir di querystring. Ini memiliki beberapa kendala tentang representasi data dan panjang.Atribut enctype
memiliki akal hanya bila menggunakan POST
metode. Ketika ditetapkan, itu menginstruksikan browser untuk mengirim form dengan pengkodean konten dalam cara tertentu. Dari MDN - Form enctype:
Ketika nilai dari metode atribut post, enctype adalah MIME jenis konten yang digunakan untuk mengirimkan form ke server.
application/x-www-form-urlencoded
: Ini adalah default. Bila formulir dikirimkan, semua nama-nama dan nilai-nilai yang dikumpulkan dan URL Encoding dilakukan pada akhir string.multipart/form-data
: Karakter yang TIDAK disandikan. Hal ini penting ketika bentuk file upload control. Anda ingin mengirim file biner dan ini memastikan bahwa bitstream tidak diubah.text/plain
: Ruang bisa diubah, tapi tidak lebih pengkodean dilakukan.Ketika mengirimkan bentuk, beberapa masalah keamanan yang dapat timbul seperti yang dinyatakan dalam RFC 7578 Bagian 7: Multipart form data - pertimbangan Keamanan:
Semua bentuk perangkat lunak pengolahan harus memperlakukan pengguna disediakan form-data dengan sensitivitas, karena sering berisi rahasia atau pribadi mengidentifikasi informasi. Ada meluasnya penggunaan bentuk "auto-mengisi" fitur dalam web browser; ini mungkin digunakan untuk mengelabui pengguna untuk tidak sadar mengirim informasi rahasia ketika menyelesaikan sebaliknya tugas-tugas berbahaya. multipart/form-data yang tidak menyediakan semua fitur untuk memeriksa integritas, memastikan kerahasiaan, menghindari pengguna kebingungan, atau fitur keamanan lainnya; kekhawatiran mereka harus ditangani oleh bentuk-mengisi form-data-menafsirkan aplikasi.
Aplikasi yang menerima bentuk-bentuk dan proses yang mereka harus berhati-hati untuk tidak memasok data kembali untuk meminta formulir-situs pengolahan yang tidak dimaksudkan untuk dikirim.
Hal ini penting ketika menafsirkan nama file dari Konten- Disposisi bidang header tidak sengaja menimpa file-file di penerima's file ruang.
Ini kekhawatiran anda jika anda seorang pengembang dan server akan memproses formulir yang dikirim oleh pengguna yang mungkin berisi informasi sensitif.
enctype='multipart/form-data'
berarti bahwa tidak ada karakter yang akan dikodekan. itulah mengapa jenis ini digunakan saat meng-upload file ke server.
Jadi multipart/form-data
digunakan ketika form membutuhkan data biner, seperti isi dari sebuah file, upload
Mengatur metode atribut untuk POSTING karena isi file dapat't dimasukkan dalam parameter URL yang menggunakan formulir.
Menetapkan nilai enctype untuk multipart/form-data karena data akan dibagi menjadi beberapa bagian, satu untuk masing-masing file ditambah satu untuk teks dari bentuk tubuh yang dapat dikirim dengan mereka.
Biasanya ini adalah ketika anda memiliki bentuk POSTING yang membutuhkan untuk mengambil upload file sebagai data... ini akan memberitahu server bagaimana hal itu akan menyandikan data yang ditransfer, dalam kasus seperti itu tidak't mendapatkan dikodekan karena itu hanya akan transfer dan meng-upload file ke server, Seperti misalnya ketika meng-upload gambar atau pdf
atribut enctype menentukan bagaimana form-data harus dikodekan ketika mengirimkan ke server.
enctype atribut hanya dapat digunakan jika metode="post".
Tidak ada karakter yang dikodekan. Nilai ini diperlukan ketika anda menggunakan bentuk-bentuk yang memiliki file upload control
Dari W3Schools