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 ...
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
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:
- [Sisi Klien] Mulai interval untuk mencari keberadaan cookie
- [Sisi Server] Lakukan apa pun yang Anda perlukan dengan data file
- [Sisi Server] Tetapkan cookie untuk interval sisi klien
- [Sisi Klien] Interval melihat cookie dan menggunakannya seperti acara onLoad. Misalnya Anda dapat memulai pemblokir UI dan kemudian onLoad (atau ketika cookie dibuat) Anda menghapus pemblokir UI.
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)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
Dan di sisi server, tepat sebelum mentransfer data file, buat cookie
setcookie('iDownloader', true, time() + 30, "/");
Plugin akan melihat cookie, dan kemudian memicu onComplete
panggilan balik.