Il modo più semplice e robusto che ho fatto in passato è semplicemente quello di scegliere come target un tag iFrame nascosto con il tuo modulo, quindi verrà inviato all'interno dell'iframe senza ricaricare la pagina.
Cioè se non si desidera utilizzare un plug-in, JavaScript o qualsiasi altra forma di "magia" diversa dall'HTML. Ovviamente puoi combinarlo con JavaScript o cosa hai ...
<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>
Puoi anche leggere il contenuto dell'iframe onLoad
per errori del server o risposte di successo e poi inviarlo all'utente.
Chrome, iFrames e onLoad
-nota- devi solo continuare a leggere se sei interessato a come impostare un blocco dell'interfaccia utente durante il caricamento / download
Attualmente Chrome non attiva l'evento onLoad per l'iframe quando viene utilizzato per trasferire file. Firefox, IE e Edge generano tutti l'evento onload per i trasferimenti di file.
L'unica soluzione che ho trovato funziona per Chrome era usare un cookie.
Per farlo fondamentalmente all'avvio del caricamento / download:
- [Lato client] Inizia un intervallo per cercare l'esistenza di un cookie
- [Lato server] Fai tutto il necessario con i dati del file
- [Lato server] Imposta cookie per intervallo lato client
- [Lato client] L'intervallo vede il cookie e lo utilizza come l'evento onLoad. Ad esempio, puoi avviare un blocco dell'interfaccia utente e quindi onLoad (o quando viene creato un cookie) rimuovi il blocco dell'interfaccia utente.
L'uso di un cookie per questo è brutto ma funziona.
Ho creato un plug-in jQuery per gestire questo problema per Chrome durante il download, che puoi trovare qui
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Lo stesso principio base si applica anche al caricamento.
Per utilizzare il downloader (includi JS, ovviamente)
$('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');
});
E sul lato server, appena prima di trasferire i dati del file, creare il cookie
setcookie('iDownloader', true, time() + 30, "/");
Il plug-in vedrà il cookie e quindi attiverà la onComplete
richiamata.