Saya ingin mengunggah file secara tidak sinkron dengan jQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Alih-alih file yang diunggah, saya hanya mendapatkan nama file. Apa yang bisa saya lakukan untuk memperbaiki masalah ini?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
sumber
sumber
Jawaban:
Dengan HTML5 Anda dapat membuat unggahan file dengan Ajax dan jQuery. Tidak hanya itu, Anda dapat melakukan validasi file (nama, ukuran, dan tipe MIME) atau menangani acara progres dengan tag progres HTML5 (atau div). Baru-baru ini saya harus membuat pengunggah file, tetapi saya tidak ingin menggunakan Flash atau Iframe atau plugins dan setelah beberapa penelitian saya menemukan solusinya.
HTML:
Pertama, Anda dapat melakukan validasi jika mau. Misalnya, dalam
.on('change')
hal file:Sekarang
$.ajax()
kirim dengan klik tombol:Seperti yang Anda lihat, mengunggah file HTML5 (dan beberapa penelitian) tidak hanya menjadi mungkin tetapi juga sangat mudah. Cobalah dengan Google Chrome karena beberapa komponen HTML5 dari contoh tidak tersedia di setiap browser.
sumber
name="file"
itu sangat penting pada<input>
tag file jika Anda akan menggunakan data dalam PHP (dan mungkin tempat lain). Saya membuat formulir secara dinamis menggunakan javascript jadi saya tidak perlu atribut nama tetapi menemukan cara yang sulit Anda benar-benar membutuhkannya untuk mengambil data sisi server.Pembaruan 2019: Masih tergantung pada browser yang Anda gunakan secara demografis.
Satu hal penting untuk dipahami dengan
file
API HTML5 "baru" adalah bahwa itu tidak didukung sampai IE 10 . Jika pasar spesifik yang Anda tuju memiliki kecenderungan lebih tinggi dari rata-rata terhadap versi Windows yang lebih lama, Anda mungkin tidak memiliki akses ke sana.Pada 2017, sekitar 5% browser adalah salah satu dari IE 6, 7, 8 atau 9. Jika Anda menuju ke perusahaan besar (misalnya, ini adalah alat B2B, atau sesuatu yang Anda berikan untuk pelatihan) jumlah itu dapat meroket . Pada 2016, saya berurusan dengan perusahaan yang menggunakan IE8 di lebih dari 60% mesin mereka.
Ini 2019 pada edit ini, hampir 11 tahun setelah jawaban awal saya. IE9 dan lebih rendah secara global berada di sekitar angka 1% tetapi masih ada kelompok penggunaan yang lebih tinggi.
Yang penting dibawa pulang dari ini — apa pun fiturnya — adalah, periksa browser apa yang digunakan pengguna Anda . Jika tidak, Anda akan belajar pelajaran yang cepat dan menyakitkan tentang mengapa "bekerja untuk saya" tidak cukup baik dalam pengiriman ke klien. caniuse adalah alat yang berguna tetapi perhatikan dari mana mereka mendapatkan demografi mereka. Mereka mungkin tidak sejajar dengan Anda. Ini tidak pernah lebih benar daripada lingkungan perusahaan.
Jawaban saya dari 2008 berikut.
Namun, ada metode unggah file non-JS yang layak. Anda dapat membuat iframe di halaman (yang Anda sembunyikan dengan CSS) dan kemudian menargetkan formulir Anda untuk mengirim ke iframe itu. Halaman utama tidak perlu dipindahkan.
Ini adalah posting "nyata" sehingga tidak sepenuhnya interaktif. Jika Anda memerlukan status, Anda memerlukan sesuatu di sisi server untuk memprosesnya. Ini sangat bervariasi tergantung pada server Anda. ASP.NET memiliki mekanisme yang lebih baik. PHP plain gagal, tetapi Anda dapat menggunakan Perl modifikasi atau Apache untuk menyiasatinya.
Jika Anda memerlukan banyak unggahan file, sebaiknya lakukan setiap file satu per satu (untuk mengatasi batas unggah file maksimum). Posting bentuk pertama ke iframe, pantau progresnya menggunakan yang di atas dan setelah selesai, posting bentuk kedua ke iframe, dan seterusnya.
Atau gunakan solusi Java / Flash. Mereka jauh lebih fleksibel dalam hal apa yang dapat mereka lakukan dengan posting mereka ...
sumber
Saya sarankan menggunakan plugin Pengunggah Baik untuk tujuan ini.
JavaScript
Kode Anda adalah:sumber
Catatan: Jawaban ini sudah usang, sekarang mungkin untuk mengunggah file menggunakan XHR.
Anda tidak dapat mengunggah file menggunakan XMLHttpRequest (Ajax). Anda dapat mensimulasikan efek menggunakan iframe atau Flash. Plugin Form jQuery yang sangat baik yang memposting file Anda melalui iframe untuk mendapatkan efek.
sumber
Membungkus untuk pembaca masa depan.
Unggah File Asinkron
Dengan HTML5
Anda dapat mengunggah file dengan jQuery menggunakan
$.ajax()
metode ini jika FormData dan File API didukung (kedua fitur HTML5).Anda juga dapat mengirim file tanpa FormData tetapi bagaimanapun API File harus ada untuk memproses file sedemikian rupa sehingga mereka dapat dikirim dengan XMLHttpRequest (Ajax).
Untuk contoh JavaScript cepat dan murni ( tanpa jQuery ) lihat " Mengirim file menggunakan objek FormData ".
Fallback
Ketika HTML5 tidak didukung (tanpa API File ) satu-satunya solusi JavaScript murni lainnya (tanpa Flash atau plugin browser lainnya) adalah teknik iframe tersembunyi , yang memungkinkan untuk meniru permintaan asinkron tanpa menggunakan objek XMLHttpRequest .
Ini terdiri dari pengaturan iframe sebagai target formulir dengan input file. Saat pengguna mengajukan permintaan dibuat dan file diunggah tetapi responsnya ditampilkan di dalam iframe alih-alih merender ulang halaman utama. Menyembunyikan iframe menjadikan seluruh proses transparan kepada pengguna dan mengemulasi permintaan asinkron.
Jika dilakukan dengan benar, ia seharusnya bekerja secara virtual pada peramban apa pun, tetapi memiliki beberapa peringatan sebagai cara untuk mendapatkan respons dari iframe.
Dalam hal ini Anda mungkin lebih suka menggunakan plugin wrapper seperti Bifröst yang menggunakan teknik iframe tetapi juga menyediakan transportasi jQuery Ajax yang memungkinkan untuk mengirim file hanya dengan
$.ajax()
metode seperti ini:Plugin
Bifröst hanyalah pembungkus kecil yang menambahkan dukungan fallback ke metode ajax jQuery, tetapi banyak dari plugin yang disebutkan di atas seperti jQuery Form Plugin atau jQuery File Upload menyertakan seluruh tumpukan dari HTML5 ke fallback yang berbeda dan beberapa fitur yang berguna untuk memudahkan proses. Bergantung pada kebutuhan dan persyaratan Anda, Anda mungkin ingin mempertimbangkan implementasi telanjang atau salah satu dari plugin ini.
sumber
contentType: false
. Ketika saya tidak mengirim ini dengan chrome, tipe konten formulir tidak valid oleh jQuery..done()
dan.fail()
callback. Juga, sebuah contoh tanpa menggunakanFormData
dan daftar pro / kontra akan luar biasa.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
File AJAX ini mengunggah plugin jQuery yang mengunggah file ke suatu tempat, dan meneruskan respons ke panggilan balik, tidak ada yang lain.
<input type="file">
- Gunakan sesedikit -
- atau sebanyak -
sumber
Saya telah menggunakan skrip di bawah ini untuk mengunggah gambar yang berfungsi dengan baik.
HTML
JavaScript
Penjelasan
Saya menggunakan respons
div
untuk menampilkan animasi dan respons pengunggahan setelah pengunggahan selesai.Bagian terbaiknya adalah Anda dapat mengirim data tambahan seperti id & dll dengan file saat Anda menggunakan skrip ini. Saya telah menyebutkannya
extra-data
seperti dalam naskah.Pada level PHP ini akan berfungsi sebagai unggahan file biasa. ekstra-data dapat diambil sebagai
$_POST
data.Di sini Anda tidak menggunakan plugin dan yang lainnya. Anda dapat mengubah kode seperti yang Anda inginkan. Anda tidak coding secara buta di sini. Ini adalah fungsionalitas inti dari setiap unggahan file jQuery. Sebenarnya Javascript.
sumber
addEventListener
bukan cross-browser.Anda dapat melakukannya dengan mudah di vanilla JavaScript. Berikut cuplikan dari proyek saya saat ini:
sumber
ondrop
acara yang dapat Anda lakukanvar file = e.dataTransfer.files[0]
Anda dapat mengunggah hanya dengan jQuery
.ajax()
.HTML:
CSS
Javascript:
sumber
Cara paling sederhana dan paling kuat yang pernah saya lakukan di masa lalu, adalah dengan hanya menargetkan tag iFrame tersembunyi dengan formulir Anda - maka itu akan mengirimkan dalam iframe tanpa memuat ulang halaman.
Itu jika Anda tidak ingin menggunakan plugin, JavaScript, atau bentuk "ajaib" selain HTML. Tentu saja Anda dapat menggabungkan ini dengan JavaScript atau apa saja ...
Anda juga dapat membaca konten iframe
onLoad
untuk kesalahan server atau respons sukses dan kemudian menampilkannya kepada pengguna.Chrome, iFrames, dan onLoad
-Catatan- Anda hanya perlu terus membaca jika Anda tertarik cara mengatur UI blocker ketika melakukan pengunggahan / pengunduhan
Saat ini Chrome tidak memicu acara onLoad untuk iframe ketika digunakan untuk mentransfer file. Firefox, IE, dan Edge semua menjalankan event onload untuk transfer file.
Satu-satunya solusi yang saya temukan berfungsi untuk Chrome adalah menggunakan cookie.
Untuk melakukan itu pada dasarnya ketika unggahan / unduhan dimulai:
Menggunakan cookie untuk ini jelek tapi berhasil.
Saya membuat plugin jQuery untuk menangani masalah ini untuk Chrome saat mengunduh, Anda dapat menemukannya di sini
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Prinsip dasar yang sama juga berlaku untuk mengunggah.
Untuk menggunakan pengunduh (sertakan JS, tentu saja)
Dan di sisi server, tepat sebelum mentransfer data file, buat cookie
Plugin akan melihat cookie, dan kemudian memicu
onComplete
panggilan balik.sumber
Solusi yang saya temukan adalah memiliki
<form>
target iFrame tersembunyi. IFrame kemudian dapat menjalankan JS untuk menampilkan kepada pengguna bahwa itu lengkap (saat memuat halaman).sumber
Saya sudah menulis ini di lingkungan Rails . Ini hanya sekitar lima baris JavaScript, jika Anda menggunakan plugin jQuery-form yang ringan.
Tantangannya adalah agar unggahan AJAX berfungsi karena standar
remote_form_for
tidak memahami pengiriman formulir multi-bagian. Itu tidak akan mengirim file data Rails mencari kembali dengan permintaan AJAX.Di situlah plugin jQuery-form ikut bermain.
Inilah kode Rails untuknya:
Ini JavaScript terkait:
Dan inilah aksi pengontrol Rails, vanilla cantik:
Saya telah menggunakan ini selama beberapa minggu terakhir dengan Bloggity, dan itu berfungsi seperti juara.
sumber
Pengunggah Ajax Sederhana adalah pilihan lain:
https://github.com/LPology/Simple-Ajax-Uploader
Contoh penggunaan:
sumber
IE7+
! Cobalah sekarang. Terima kasihjQuery Uploadify adalah plugin bagus lain yang telah saya gunakan sebelumnya untuk mengunggah file. Kode JavaScript sesederhana berikut: kode. Namun, versi baru tidak berfungsi di Internet Explorer.
Saya telah melakukan banyak pencarian dan saya datang ke solusi lain untuk mengunggah file tanpa plugin apa pun dan hanya dengan ajax. Solusinya adalah sebagai berikut:
sumber
Berikut ini hanyalah solusi lain tentang cara mengunggah file ( tanpa plugin apa pun )
Menggunakan Javascripts dan AJAX sederhana (dengan progress-bar)
Bagian HTML
Bagian JS
Bagian PHP
Inilah aplikasi CONTOH
sumber
Anda dapat menggunakan data formulir untuk mengirim semua nilai Anda termasuk gambar.
sumber
cache: false
berlebihan padaPOST
permintaan karenaPOST
tidak pernah menyimpan cache.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Untuk mengunggah file secara tidak sinkron dengan Jquery, gunakan langkah-langkah di bawah ini:
langkah 1 Dalam proyek Anda, buka Nuget manager dan tambahkan paket (jquery fileupload (hanya Anda perlu menuliskannya di kotak pencarian, itu akan muncul dan menginstalnya.)) URL: https://github.com/blueimp/jQuery-File- Unggah
langkah 2 Tambahkan skrip di bawah ini dalam file HTML, yang sudah ditambahkan ke proyek dengan menjalankan paket di atas:
langkah 3 Tulis kontrol unggah file sesuai kode di bawah ini:
langkah 4 tulis metode js sebagai uploadFile seperti di bawah ini:
langkah 5 Dalam unggahan file elemen panggilan fungsi siap untuk memulai proses seperti di bawah ini:
Langkah 6 Tulis kontrol dan Aksi MVC seperti di bawah ini:
sumber
Pendekatan modern tanpa Jquery adalah menggunakan objek FileList yang Anda dapatkan kembali
<input type="file">
ketika pengguna memilih file dan kemudian menggunakan Ambil untuk memposting FileList melilit objek FormData .sumber
Anda dapat melihat solusi yang dipecahkan dengan demo yang berfungsi di sini yang memungkinkan Anda untuk melihat pratinjau dan mengirimkan file formulir ke server. Untuk kasus Anda, Anda perlu menggunakan Ajax untuk memfasilitasi pengunggahan file ke server:
Data yang dikirim adalah formdata. Di jQuery Anda, gunakan fungsi kirim formulir alih-alih klik tombol untuk mengirimkan file formulir seperti yang ditunjukkan di bawah ini.
Lihat lebih detail
sumber
Contoh: Jika Anda menggunakan jQuery, Anda dapat dengan mudah mengunggah file. Ini adalah plugin jQuery yang kecil dan kuat, http://jquery.malsup.com/form/ .
Contoh
Saya harap ini akan membantu
sumber
Kamu bisa menggunakan
Demo
sumber
Konversikan file ke base64 menggunakan readAsDataURL () HTML5 () atau encoder base64 . Biola di sini
Kemudian untuk mengambil:
sumber
Anda dapat memberikan parameter tambahan bersama dengan nama file untuk membuat unggahan asinkron menggunakan XMLHttpRequest (tanpa flash dan ketergantungan iframe). Tambahkan nilai parameter tambahan dengan FormData dan kirim permintaan unggahan.
Juga, unggahan file Syncfusion JavaScript UI memberikan solusi untuk skenario ini hanya dengan menggunakan argumen acara. Anda dapat menemukan dokumentasi di sini dan rincian lebih lanjut tentang kontrol ini di sini masukkan deskripsi tautan di sini
sumber
Cari Menangani proses pengunggahan untuk file, asinkron di sini: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Sampel dari tautan
sumber
Ini solusi saya.
dan js
Pengendali
sumber
Menggunakan HTML5 dan JavaScript , mengunggah async cukup mudah, saya membuat logika pengunggahan bersama dengan html Anda, ini tidak sepenuhnya berfungsi karena membutuhkan api, tetapi tunjukkan cara kerjanya, jika Anda memiliki endpoint yang dipanggil
/upload
dari root situs web Anda, kode ini akan bekerja untuk Anda:Juga beberapa informasi lebih lanjut tentang XMLHttpReques:
Untuk detail lebih lanjut, Anda dapat melanjutkan membaca di sini ...
sumber
Anda dapat menggunakan Fetch API yang lebih baru dengan JavaScript. Seperti ini:
Keuntungan: Ambil API didukung secara native oleh semua browser modern, jadi Anda tidak perlu mengimpor apa pun. Juga, perhatikan bahwa fetch () mengembalikan Janji yang kemudian ditangani dengan menggunakan secara tidak
.then(..code to handle response..)
sinkron.sumber
Anda dapat melakukan unggahan Banyak File Asynchronous menggunakan JavaScript atau jQuery dan tanpa menggunakan plugin apa pun. Anda juga dapat menampilkan kemajuan waktu nyata dari unggahan file dalam kontrol kemajuan. Saya menemukan 2 tautan bagus -
Bahasa sisi server adalah C # tetapi Anda dapat melakukan beberapa modifikasi untuk membuatnya bekerja dengan bahasa lain seperti PHP.
Unggah File ASP.NET Core MVC:
Dalam Lihat buat kontrol unggah file dalam html:
Sekarang buat metode tindakan di controller Anda:
variabel hostingEnvironment adalah tipe IHostingEnvironment yang dapat disuntikkan ke controller menggunakan injeksi dependensi, seperti:
sumber
Untuk PHP, cari https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
sumber
Anda juga dapat mempertimbangkan untuk menggunakan sesuatu seperti https://uppy.io .
Itu mengunggah file tanpa menavigasi jauh dari halaman dan menawarkan beberapa bonus seperti drag & drop, melanjutkan unggahan jika browser crash / jaringan terkelupas, dan mengimpor dari misalnya Instagram. Ini open source dan tidak bergantung pada jQuery / React / Angular / Vue, tetapi dapat digunakan dengannya. Penafian: sebagai pencipta saya bias;)
sumber