Najprostszym i najbardziej niezawodnym sposobem, w jaki to zrobiłem w przeszłości, jest po prostu celowanie w ukryty znacznik iFrame za pomocą formularza - następnie zostanie on przesłany w elemencie iframe bez ponownego ładowania strony.
To znaczy, jeśli nie chcesz używać wtyczki, JavaScript ani innych form „magii” innych niż HTML. Oczywiście możesz to połączyć z JavaScriptem lub czym ...
<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>
Możesz także przeczytać zawartość ramki iframe pod onLoad
kątem błędów serwera lub odpowiedzi na sukces, a następnie przekazać ją użytkownikowi.
Chrome, iFrames i onLoad
-Uwaga- musisz czytać dalej, jeśli jesteś zainteresowany tym, jak skonfigurować blokadę interfejsu użytkownika podczas przesyłania / pobierania
Obecnie Chrome nie wyzwala zdarzenia onLoad dla elementu iframe, gdy jest on używany do przesyłania plików. Firefox, IE i Edge wszystkie uruchamiają zdarzenie onload podczas przesyłania plików.
Jedyne rozwiązanie, które znalazłem, działa w przeglądarce Chrome, to użycie pliku cookie.
Aby to zrobić w zasadzie po uruchomieniu przesyłania / pobierania:
- [Po stronie klienta] Rozpocznij interwał, aby sprawdzić istnienie pliku cookie
- [Po stronie serwera] Rób co chcesz z danymi pliku
- [Po stronie serwera] Ustaw plik cookie dla interwału po stronie klienta
- [Po stronie klienta] Interwał widzi ciasteczko i wykorzystuje je jak zdarzenie onLoad. Na przykład możesz uruchomić blokadę interfejsu użytkownika, a następnie onLoad (lub po utworzeniu pliku cookie) usuwasz blokadę interfejsu użytkownika.
Używanie do tego pliku cookie jest brzydkie, ale działa.
Zrobiłem wtyczkę jQuery, aby poradzić sobie z tym problemem dla Chrome podczas pobierania, znajdziesz tutaj
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Ta sama podstawowa zasada dotyczy również przesyłania.
Aby użyć downloadera (oczywiście JS)
$('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');
});
A po stronie serwera, tuż przed przesłaniem danych pliku, utwórz ciasteczko
setcookie('iDownloader', true, time() + 30, "/");
Wtyczka zobaczy plik cookie, a następnie wyzwoli połączenie onComplete
zwrotne.