BACA SETIDAKNYA PARA PERTAMA DI SINI!
Saya tahu ini terlambat 3 tahun, tetapi jawaban Matt (diterima) tidak lengkap dan pada akhirnya akan membuat Anda kesulitan. Kuncinya di sini adalah, jika Anda memilih untuk menggunakan multipart/form-data
, batas tidak boleh muncul dalam data file yang akhirnya diterima server.
Ini bukan masalah bagi application/x-www-form-urlencoded
, karena tidak ada batasan. x-www-form-urlencoded
juga dapat selalu menangani data biner, dengan cara sederhana mengubah satu byte sewenang-wenang menjadi tiga 7BIT
byte. Tidak efisien, tetapi berfungsi (dan perhatikan bahwa komentar tentang tidak dapat mengirim nama file serta data biner salah; Anda hanya mengirimnya sebagai pasangan kunci / nilai lain).
Masalahnya multipart/form-data
adalah bahwa pemisah batas tidak boleh ada dalam data file (lihat RFC 2388 ; bagian 5.2 juga mencakup alasan yang agak timpang karena tidak memiliki tipe MIME agregat yang tepat yang menghindari masalah ini).
Jadi, pada pandangan pertama, multipart/form-data
tidak ada nilai sama sekali dalam file apa pun , biner atau lainnya. Jika Anda tidak memilih batas dengan benar, maka pada akhirnya Anda akan memiliki masalah, apakah Anda mengirim teks biasa atau biner mentah - server akan menemukan batas di tempat yang salah, dan file Anda akan terpotong, atau POST akan gagal.
Kuncinya adalah memilih pengkodean dan batas sehingga karakter batas yang Anda pilih tidak dapat muncul dalam output yang disandikan. Salah satu solusi sederhana adalah dengan menggunakan base64
(jangan tidak menggunakan biner mentah). Dalam base64 3 byte acak dikodekan menjadi empat karakter 7-bit, di mana himpunan karakter keluarannya [A-Za-z0-9+/=]
(yaitu alfanumerik, '+', '/' atau '='). =
adalah kasus khusus, dan hanya dapat muncul di akhir output yang disandikan, sebagai tunggal =
atau ganda ==
. Sekarang, pilih batas Anda sebagai string ASCII 7-bit yang tidak dapat muncul dalam base64
output. Banyak pilihan yang Anda lihat di internet gagal dalam tes ini - MDN membentuk dokumen, misalnya, gunakan "gumpalan" sebagai batas saat mengirim data biner - tidak baik. Namun, sesuatu seperti "gumpalan!" tidak akan pernah muncul dalam base64
output.