Bunu geçmişte yaptığım en basit ve en sağlam yol, formunuzla gizli bir iFrame etiketini hedeflemektir - o zaman sayfayı yeniden yüklemeden iframe içinde gönderir.
HTML'den başka bir eklenti, JavaScript veya başka bir "sihirli" form kullanmak istemezsiniz. Elbette bunu JavaScript ile birleştirebilir veya neyiniz var ...
<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>
onLoad
Sunucu hataları veya başarı yanıtları için iframe'in içeriğini de okuyabilir ve daha sonra bunu kullanıcıya gönderebilirsiniz.
Chrome, iFrames ve onLoad
-note- sadece yükleme / indirme yaparken bir UI engelleyiciyi nasıl kuracağınızla ilgileniyorsanız okumaya devam etmeniz gerekir.
Şu anda Chrome, dosya aktarmak için kullanıldığında iframe için onLoad olayını tetiklememektedir. Firefox, IE ve Edge dosya aktarımları için onload olayını başlatır.
Chrome için işe yaradığını bulduğum tek çözüm bir çerez kullanmaktı.
Bunu temel olarak yükleme / indirme işlemi başlatıldığında yapmak için:
- [Müşteri Tarafı] Bir çerezin varlığını aramak için bir aralık başlatın
- [Sunucu Tarafı] Dosya verileriyle ne gerekiyorsa yapın
- [Server Side] İstemci tarafı aralığı için çerezi ayarla
- [İstemci Tarafı] Aralık, çerezi görür ve onLoad etkinliği gibi kullanır. Örneğin, bir kullanıcı arabirimi engelleyicisini başlatabilir ve ardından onLoad (veya çerez yapıldığında) kullanıcı arabirimi engelleyicisini kaldırırsınız.
Bunun için bir çerez kullanmak çirkin ama işe yarıyor.
İndirirken Chrome için bu sorunu ele almak için bir jQuery eklentisi yaptım, burada bulabilirsiniz
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Aynı temel prensip yükleme için de geçerlidir.
İndiriciyi kullanmak için (tabii ki JS'yi ekleyin)
$('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');
});
Ve sunucu tarafında, dosya verilerini aktarmadan hemen önce, çerez oluşturun
setcookie('iDownloader', true, time() + 30, "/");
Eklenti çerezi görecek ve ardından onComplete
geri aramayı tetikleyecektir .