Saat ini saya memiliki formulir HTML di mana pengguna mengisi rincian iklan yang ingin mereka posting. Sekarang saya ingin dapat menambahkan dropzone untuk mengunggah gambar barang yang dijual.
Saya telah menemukan Dropzone.js yang tampaknya melakukan sebagian besar yang saya butuhkan. Namun, ketika melihat ke dalam dokumentasi, tampak bahwa Anda perlu menentukan kelas dari seluruh formulir sebagai dropzone
(bukan hanya elemen input ). Ini kemudian berarti bahwa seluruh formulir saya menjadi dropzone .
Apakah mungkin untuk menggunakan dropzone hanya di sebagian dari formulir saya, yaitu dengan hanya menetapkan elemen sebagai kelas "dropzone" , daripada seluruh formulir?
Saya dapat menggunakan formulir terpisah, tetapi saya ingin pengguna dapat mengirimkan semuanya dengan satu tombol.
Atau, apakah ada perpustakaan lain yang bisa melakukan ini?
Terimakasih banyak
sumber
Saya memiliki masalah yang sama persis dan menemukan bahwa jawaban Varan Sinayee adalah satu-satunya yang benar-benar menyelesaikan pertanyaan aslinya. Jawaban itu dapat disederhanakan, jadi inilah versi yang lebih sederhana.
Langkah-langkahnya adalah:
Buat formulir normal (jangan lupa metode dan enctype args karena ini tidak lagi ditangani oleh dropzone).
Letakkan div di dalamnya dengan
class="dropzone"
(itulah yang dilampirkan Dropzone padanya) danid="yourDropzoneName"
(digunakan untuk mengubah opsi).Setel opsi Dropzone, untuk mengatur url tempat formulir dan file akan diposting, nonaktifkan autoProcessQueue (jadi itu hanya terjadi ketika pengguna menekan 'kirim') dan mengizinkan beberapa unggahan (jika Anda membutuhkannya).
Setel fungsi init untuk menggunakan Dropzone alih-alih perilaku default saat tombol kirim diklik.
Masih dalam fungsi init, gunakan pengendali event "sendmultiple" untuk mengirim data formulir bersama file.
Voa! Anda sekarang dapat mengambil data seperti yang Anda lakukan dengan formulir normal, dalam $ _POST dan $ _FILES (dalam contoh ini akan terjadi di upload.php)
HTML
JS
sumber
processQueue()
panggilan? Saya mencoba menggunakansubmit()
atauclick()
, keduanya tidak bekerja.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(maaf saya tidak tahu bagaimana cara membuat linebreak di sini)"Dropzone.js" adalah perpustakaan paling umum untuk mengunggah gambar. Jika Anda ingin memiliki "dropzone.js" hanya sebagai bagian dari formulir Anda, Anda harus melakukan langkah-langkah berikut:
1) untuk sisi klien:
HTML:
JQuery:
2) untuk sisi server:
ASP.Net MVC
sumber
Tutorial Enyo sangat bagus.
Saya menemukan bahwa skrip sampel dalam tutorial berfungsi dengan baik untuk tombol yang disematkan di dropzone (yaitu, elemen bentuk). Jika Anda ingin memiliki tombol di luar elemen formulir, saya dapat menyelesaikannya menggunakan acara klik:
Pertama, HTML:
Kemudian, tag skrip ....
sumber
Lebih jauh dari apa yang dikatakan sqram, Dropzone memiliki opsi tambahan tanpa dokumen, "hiddenInputContainer". Yang harus Anda lakukan adalah mengatur opsi ini ke pemilih formulir yang Anda inginkan bidang file yang tersembunyi akan ditambahkan. Dan voila! Bidang file ".dz-hidden-input" yang biasanya ditambahkan Dropzone ke tubuh secara ajaib pindah ke formulir Anda. Tidak mengubah kode sumber Dropzone.
Sekarang sementara ini berfungsi untuk memindahkan bidang file Dropzone ke formulir Anda, bidang tersebut tidak memiliki nama. Jadi, Anda perlu menambahkan:
ke dropzone.js setelah baris ini:
sekitar garis 547.
sumber
Saya punya solusi yang lebih otomatis untuk ini.
HTML:
JavaScript:
Laravel:
Tidak perlu menonaktifkan DropZone Discovery dan pengiriman formulir normal akan dapat mengirim file dengan bidang formulir lain melalui serialisasi formulir standar.
Mekanisme ini menyimpan konten file sebagai string base64 di bidang input tersembunyi saat diproses. Anda dapat mendekodekannya kembali ke string biner dalam PHP melalui
base64_decode()
metode standar .Saya tidak tahu apakah metode ini akan dikompromikan dengan file besar tetapi berfungsi dengan ~ 40MB file.
sumber
Anda dapat mengubah formData dengan menangkap acara 'pengiriman' dari dropzone Anda.
sumber
Untuk mengirimkan semua file bersama dengan data formulir lainnya dalam satu permintaan, Anda dapat menyalin Dropzone.js
input
node tersembunyi sementara ke dalam formulir Anda. Anda dapat melakukan ini dalamaddedfiles
event handler:Jelas ini adalah solusi yang tergantung pada detail implementasi. Kode sumber terkait .
sumber
myDropzone.on("thumbnail", () => {})
acara tersebut. Melakukan pemrosesan segera pada"addedFile"
file mungkin masih dapatundefined
diakses.files[]
tetapi kosong apa pun yang saya lakukan. Ada ide? Melakukannya di Laravel jika ada bedanya.Saya ingin berkontribusi jawaban di sini karena saya juga menghadapi masalah yang sama - kami ingin elemen $ _FILES tersedia sebagai bagian dari pos yang sama dengan formulir lain. Jawaban saya didasarkan pada @ mrtnmgs namun mencatat komentar yang ditambahkan ke pertanyaan itu.
Pertama: Dropzone memposting datanya melalui ajax
Hanya karena Anda menggunakan
formData.append
opsi masih berarti bahwa Anda harus menangani tindakan UX - yaitu ini semua terjadi di belakang layar dan bukan bentuk posting yang khas. Data diposting keurl
parameter Anda .Kedua: Jika Anda ingin menirukan postingan form, Anda perlu menyimpan data yang diposting
Ini memerlukan kode sisi server untuk menyimpan
$_POST
atau$_FILES
dalam sesi yang tersedia untuk pengguna di halaman lain karena pengguna tidak akan pergi ke halaman di mana data yang diposting diterima.Ketiga: Anda harus mengarahkan pengguna ke halaman tempat data ini ditindaklanjuti
Sekarang Anda telah memposting data Anda, menyimpannya dalam satu sesi, Anda perlu menampilkan / mengambil tindakan untuk pengguna di halaman tambahan. Anda perlu mengirim pengguna ke halaman itu juga.
Jadi untuk contoh saya:
[Kode Dropzone: Menggunakan Jquery]
sumber
Ini hanyalah contoh lain bagaimana Anda bisa menggunakan Dropzone.js dalam formulir yang ada.
dropzone.js:
Lalu, nanti dalam file yang saya masukkan
Ini mengasumsikan Anda memiliki div dengan id
#botofform
seperti itu saat mengunggah Anda dapat menggunakan nama file yang diunggah.Catatan: skrip unggah saya mengembalikan dubblenoteupuploadedfilename.jpeg Anda juga perlu membuat skrip pembersihan yang memeriksa direktori unggahan untuk file yang tidak digunakan dan menghapusnya .. jika dalam bentuk front-end tidak diautentikasi :)
sumber
Ini contoh saya, berdasarkan Django + Dropzone. Lihat telah memilih (wajib) dan mengirimkan.
sumber