La manière la plus simple et la plus robuste que j'ai faite dans le passé, consiste simplement à cibler une balise iFrame cachée avec votre formulaire - puis elle sera soumise dans l'iframe sans recharger la page.
C'est-à-dire si vous ne voulez pas utiliser un plugin, JavaScript ou toute autre forme de "magie" autre que HTML. Bien sûr, vous pouvez combiner cela avec JavaScript ou ce que vous avez ...
<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>
Vous pouvez également lire le contenu de l'iframe onLoad
pour les erreurs de serveur ou les réponses réussies, puis les transmettre à l'utilisateur.
Chrome, iFrames et onLoad
-note- vous ne devez continuer à lire que si vous êtes intéressé par la façon de configurer un bloqueur d'interface utilisateur lors du téléchargement / téléchargement
Actuellement, Chrome ne déclenche pas l'événement onLoad pour l'iframe lorsqu'il est utilisé pour transférer des fichiers. Firefox, IE et Edge déclenchent tous l'événement onload pour les transferts de fichiers.
La seule solution que j'ai trouvée compatible avec Chrome était d'utiliser un cookie.
Pour ce faire, essentiellement lorsque le téléchargement / téléchargement est démarré:
- [Côté client] Commencez un intervalle pour rechercher l'existence d'un cookie
- [Côté serveur] Faites tout ce dont vous avez besoin avec les données du fichier
- [Côté serveur] Définir un cookie pour l'intervalle côté client
- [Côté client] Interval voit le cookie et l'utilise comme l'événement onLoad. Par exemple, vous pouvez démarrer un bloqueur d'interface utilisateur, puis onLoad (ou lorsqu'un cookie est créé) vous supprimez le bloqueur d'interface utilisateur.
L'utilisation d'un cookie pour cela est moche mais cela fonctionne.
J'ai créé un plugin jQuery pour gérer ce problème pour Chrome lors du téléchargement, vous pouvez le trouver ici
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Le même principe de base s'applique également au téléchargement.
Pour utiliser le téléchargeur (y compris le JS, évidemment)
$('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');
});
Et côté serveur, juste avant de transférer les données du fichier, créez le cookie
setcookie('iDownloader', true, time() + 30, "/");
Le plugin verra le cookie, puis déclenchera le onComplete
rappel.