Saya menggunakan jQuery dan Ajax untuk formulir saya untuk mengirim data dan file tetapi saya tidak yakin bagaimana mengirim data dan file dalam satu formulir?
Saat ini saya melakukan hampir sama dengan kedua metode tetapi cara di mana data dikumpulkan ke dalam array berbeda, data menggunakan .serialize();
tetapi file menggunakan= new FormData($(this)[0]);
Apakah mungkin untuk menggabungkan kedua metode agar dapat mengunggah file dan data dalam satu bentuk melalui Ajax?
Data jQuery, Ajax dan html
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
File jQuery, Ajax dan html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
Bagaimana saya bisa menggabungkan di atas sehingga saya dapat mengirim data dan file dalam satu bentuk melalui Ajax?
Tujuan saya adalah untuk dapat mengirim semua formulir ini dalam satu posting dengan Ajax, mungkinkah?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
javascript
jquery
ajax
forms
Dan
sumber
sumber
FormData
Pendekatan harus bekerja dengan baik dengan bentuk-bentuk yang mengandung apa pun yang Anda inginkan, bukan hanya bidang upload file; itu tidak didukung secara luas sekalipun.FormData
Jawaban:
Masalah yang saya miliki adalah menggunakan pengidentifikasi jQuery yang salah.
Anda dapat mengunggah data dan file dengan satu formulir menggunakan ajax .
PHP + HTML
jQuery + Ajax
Versi pendek
sumber
$(this)[0]
hanya aliasthis
, jadinew FormData(this)
harus cukup.async: false
tampaknya tidak diperlukan untuk ini untuk bekerja dan menyebabkan pemblokiran di ponsel (single threaded) browserPilihan lain adalah menggunakan iframe dan mengatur target form untuk itu.
Anda dapat mencoba ini (menggunakan jQuery):
ini bekerja dengan baik dengan semua browser, Anda tidak perlu membuat cerita bersambung atau menyiapkan data. satu kelemahannya adalah Anda tidak dapat memantau perkembangannya.
juga, setidaknya untuk chrome, permintaan tidak akan muncul di tab "xhr" pada alat pengembang tetapi di bawah "doc"
sumber
Saya mengalami masalah yang sama di ASP.Net MVC dengan HttpPostedFilebase dan alih-alih menggunakan formulir Kirim saya harus menggunakan tombol klik di mana saya perlu melakukan beberapa hal dan kemudian jika semua OK kirimkan formulir jadi di sini adalah bagaimana saya membuatnya bekerja
ini akan daripada benar mengisi model MVC Anda, pastikan dalam Model Anda, Properti untuk HttpPostedFileBase [] memiliki nama yang sama dengan Nama kontrol input dalam html yaitu
sumber
contentType : "application/octet-stream"
Atau lebih pendek:
sumber
Bagi saya, itu tidak berfungsi tanpa
enctype: 'multipart/form-data'
bidang dalam permintaan Ajax. Saya harap ini membantu seseorang yang terjebak dalam masalah yang sama.Meskipun
enctype
sudah ditetapkan dalam atribut form , untuk beberapa alasan, permintaan Ajax tidak secara otomatis mengidentifikasienctype
tanpa deklarasi eksplisit (jQuery 3.3.1).Seperti yang disebutkan di atas, harap juga memberikan perhatian khusus pada bidang
contentType
danprocessData
.sumber
enctype
tidak disebutkan sama sekali.enctype
bidang tidak tercakup dalam dokumentasi karena suatu alasan. Saya belum memeriksa kode sumber jQuery jadi saya tidak bisa mengatakan dengan pasti.enctype
bidang dan tidak lagi mengunggah file (jenis kesalahan pengkodean kembali). Saya tidak yakin cara kerjanya karena saya belum memeriksa kode sumber jQuery. Saya memposting jawaban ini dengan tujuan membantu orang lain yang terjebak dalam masalah yang sama. Saya tidak memancing upvote di sini ... Jika Anda memiliki pertanyaan / komentar lebih lanjut, mari kita mengobrol daripada berkomentar.Bagi saya mengikuti pekerjaan kode
Dalam Metode Postingan Anda, sampaikan parameter sebagai HttpPostedFileBase UploadFile dan pastikan input file Anda sama seperti yang disebutkan dalam parameter Anda pada Metode Tindakan. Ini harus bekerja dengan formulir Mulai AJAX juga.
Ingat di sini bahwa Formulir AJAX BEGIN Anda tidak akan berfungsi di sini karena Anda membuat panggilan pos Anda didefinisikan dalam kode yang disebutkan di atas dan Anda dapat referensi metode Anda dalam kode sesuai Kebutuhan.
Saya tahu saya menjawab terlambat tetapi ini yang berhasil bagi saya
sumber
Cara sederhana tetapi lebih efektif:
new FormData()
itu sendiri seperti wadah (atau tas). Anda dapat meletakkan semuanya attr atau file dengan sendirinya. Satu-satunya hal yang Anda perlu tambahkanattribute, file, fileName
misalnya:dan kirimkan saja dalam permintaan AJAX. Misalnya:
Anda dapat menambahkan sejumlah file atau data dengan FormData.
dan jika Anda membuat Permintaan AJAX dari file Script.js untuk merutekan file di Node.js jangan gunakan
req.body
untuk mengakses data (yaitu teks)req.files
untuk mengakses file (yaitu gambar, video dll)sumber
Dalam kasus saya, saya harus membuat permintaan POST, yang memiliki informasi yang dikirim melalui header, dan juga file yang dikirim menggunakan objek FormData.
Saya membuatnya bekerja menggunakan kombinasi dari beberapa jawaban di sini, jadi pada dasarnya apa yang akhirnya berhasil adalah memiliki lima baris ini dalam permintaan Ajax saya:
Di mana formData adalah variabel yang dibuat seperti ini:
sumber
contentType: "application/octet-stream",
aktif berbahaya dan satu-satunya alasan tidak menyebabkan masalah adalah karena Anda menimpanya dua baris nanti.enctype: 'multipart/form-data',
tidak ada gunanya. jQuery.ajax tidak mengenali paramater itu.///// otherpage.php
sumber