Bagaimana saya bisa mengonversi Objek JS saya menjadi FormData
?
Alasan mengapa saya ingin melakukan ini adalah, saya memiliki objek yang saya buat dari nilai bidang formulir ~ 100.
var item = {
description: 'Some Item',
price : '0.00',
srate : '0.00',
color : 'red',
...
...
}
Sekarang saya diminta untuk menambahkan fungsionalitas file unggahan ke formulir saya yang, tentu saja tidak mungkin melalui JSON, jadi saya berencana untuk pindah ke FormData
. Jadi, apakah ada cara agar saya dapat mengonversi objek JS saya FormData
?
javascript
jquery
multipartform-data
form-data
Kamran Ahmed
sumber
sumber
FormData
obyek.Jawaban:
Jika Anda memiliki objek, Anda dapat dengan mudah membuat objek FormData dan menambahkan nama dan nilai dari objek tersebut ke formData.
Anda belum memposting kode apa pun, jadi ini adalah contoh umum;
Ada lebih banyak contoh dalam dokumentasi di MDN
sumber
item
adalah objek biasa yang dibuat oleh OP, jadi seharusnya tidak memiliki properti yang bukan miliknya, kecuali seseorang membuat kesalahan dengan membuat prototipe sesuatu ke konstruktor Objek, dalam hal ini Anda akan berada dalam dunia yang bermasalah , dan itu bukanlah sesuatu yang harus kita lindungi.Object.keys
bukanlah jawabannya, karena Anda tidak harus mendapatkan kunci sebagai array, lalu mengulangi kunci untuk mendapatkannya nilai-nilai, Anda harus menggunakanfor..in
loop.Object.keys
atauhasOwnProperty()
sebagai objek yang diposting dalam pertanyaan dan seharusnya tidak memerlukan semua itu. Alasan terkadang Anda melihathasOwnProperty
digunakan di plugin, dll. Adalah karena Anda tidak pernah tahu apa yang mungkin dilakukan beberapa orang padaObject
konstruktor, tetapi sebagian besar orang tidak perlu menguji properti yang diwariskan pada objek yang mereka buat, itu pertanda bahwa Anda mungkin melakukan sesuatu yang salah.Dengan ES6 dan pendekatan pemrograman yang lebih fungsional, jawaban @ adeneo akan terlihat seperti ini:
Dan sebagai alternatif menggunakan
.reduce()
dan fungsi panah:sumber
Fungsi ini menambahkan semua data dari objek ke FormData
Versi ES6 dari @ developer033:
versi jQuery:
sumber
&& !(data instanceof Blob)
dalam kasus saya untuk mengunggah gambar saya&& !(Array.isArray(data) && !data.length)
kondisi "jika", atau array kosong akan dihapus.Jawaban lainnya tidak lengkap bagi saya. Saya mulai dari jawaban Vladimir Novopashin dan memodifikasinya. Inilah hal-hal yang saya butuhkan dan bug yang saya temukan:
.prop
bukan[prop]
. Misalnya,formData.append('photos[0][file]', file)
tidak berfungsi di google chrome, saatformData.append('photos[0].file', file)
bekerjaKode berikut harus berfungsi di IE11 dan browser evergreen.
sumber
formData.append(root, data)
, itu tidak berarti itu ditambahkan ke root.Coba fungsi JSON.stringify seperti di bawah ini
sumber
Saya memiliki skenario di mana JSON bersarang harus diserialkan secara linier sementara data formulir dibuat, karena ini adalah cara server mengharapkan nilai. Jadi, saya menulis fungsi rekursif kecil yang menerjemahkan JSON seperti ini:
Menjadi seperti ini:
Server akan menerima data formulir yang dalam format yang dikonversi ini.
Berikut fungsinya:
Doa:
Saya menggunakan testJSON hanya untuk melihat hasil yang dikonversi karena saya tidak dapat mengekstrak konten form_data. Panggilan pos AJAX:
sumber
Maaf untuk jawaban yang terlambat, tetapi saya kesulitan dengan ini karena Angular 2 saat ini tidak mendukung pengunggahan file. Jadi, cara melakukannya adalah dengan mengirimkan
XMLHttpRequest
withFormData
. Jadi, saya membuat fungsi untuk melakukannya. Saya menggunakan Ketikan . Untuk mengubahnya menjadi Javascript cukup hapus deklarasi tipe data.sumber
[]
untuk properti objek di dalam larik numerik agar tetap utuhVersi TypeScript:
https://gist.github.com/Mds92/091828ea857cc556db2ca0f991fee9f6
sumber
namespace
adalah kata kunci yang dipesan diTypeScript
( typescriptlang.org/docs/handbook/namespaces.html dan github.com/Microsoft/TypeScript/issues/… ). Juga, tampaknya Anda lupa berurusanFile
sejak suratelse
wasiat terakhirappend
"[object File]"
keformData
.Anda cukup menginstal
qs
:Cukup impor:
Berikan objek ke
qs.stringify()
:sumber
Secara rekursif
sumber
Metode ini mengonversi objek JS menjadi FormData:
sumber
Object.entries(value).forEach((v, k) => acc.append(`${key}[${v[0]}]`, v[1]));
Dalam kasus saya, objek saya juga memiliki properti yang berupa array file. Karena mereka biner, mereka harus ditangani secara berbeda - indeks tidak perlu menjadi bagian dari kunci. Jadi saya mengubah jawaban @Vladimir Novopashin dan @ developer033:
sumber
Saya menggunakan ini untuk Posting data objek saya sebagai Data Formulir.
sumber
Mungkin Anda sedang mencari ini, kode yang menerima objek javascript Anda, buat objek FormData darinya dan kemudian POST ke server Anda menggunakan Fetch API baru :
sumber
Saya mereferensikan ini dari jawaban Gudradain . Saya mengeditnya sedikit dalam format Ketikan.
sumber
Saya mungkin sedikit terlambat ke pesta tetapi inilah yang saya buat untuk mengonversi objek tunggal ke FormData.
Bagaimana cara kerjanya? Ini akan mengubah dan mengembalikan semua properti mengharapkan objek File yang telah Anda setel dalam daftar abaikan (argumen ke-2. Jika ada yang bisa memberi tahu saya cara yang lebih baik untuk menentukan ini yang akan membantu!) Ke dalam string json menggunakan
JSON.stringify
. Kemudian di server Anda, Anda hanya perlu mengubahnya kembali menjadi objek JSON.Contoh:
Saya masih agak baru dalam permintaan Http dan JavaScript sehingga setiap umpan balik akan sangat dihargai!
sumber
Coba obj2fd => https://www.npmjs.com/package/obj2fd
sumber