Comment masquer un gif animé après le téléchargement du fichier?

Existe-t-il un moyen de faire disparaître une image gif animée après l’exécution d’un code Java côté serveur et l’obtention d’une réponse HTTP du serveur Web sans utiliser Ajax?

J’utilise le bouton d’envoi Struts2 suivant:

 

Méthode d’affichage de l’image gif animée:

 function myJsFunction(){ $("#containerWithGifImage").fadeIn("fast"); } 

Méthode pour faire disparaître l’image gif animée (mais je n’ai aucune idée de comment l’appeler sans Ajax):

  function myJsFunction2(){ $("#containerWithGifImage").fadeOut("fast"); } 

Maintenant, le gif apparaît, mais il ne disparaît pas après l’exécution du code Java sur le serveur Web.

Vos deux questions (celle-ci et l’autre ) sont des exemples du problème XY .

Avant de rechercher des technologies, techniques ou hacks spécifiques, commencez à définir clairement votre objective:

Le but

  1. Télécharger un fichier sans passer aux autres pages;
  2. Pendant ce temps, affiche un indicateur (barre de progression, gif animé, superposition, etc …);
  3. Une fois le fichier téléchargé, masquez l’indicateur.

La solution

Liez votre déclencheur à une fonction javascript comme décrit ici :

  download  

Dans votre fonction Javascript: affichez l’indicateur, lancez un chronomètre pour vérifier si le téléchargement est terminé (puis masquez l’indicateur), puis téléchargez le fichier:

  function myJsFunction(){ $("#containerWithGifImage").fadeIn("fast"); // Show the indicator setInterval(function(){ $.ajax({ url : "/isDownloadFinished.action", type : "GET", success : function(data,textStatus,jqXHR) { $("#containerWithGifImage").fadeOut("fast"); // Hide the indicator },error : function(jqXHR, textStatus, errorThrown) { console.log("Download is still in progress, do nothing..."); } }); }, 1000); // Check every second if download has finished window.location='/download.action'; // Start the download } 

Download.action doit mettre dans la session un atsortingbut indiquant que le téléchargement a commencé et le mettre à jour à la fin.
Dans la mesure où, avec le résultat du stream vous transmettez le contrôle de la réponse au navigateur (vous ne pouvez donc pas exécuter de code une fois terminé), vous pouvez écrire directement dans la réponse, puis renvoyer NONE , comme décrit ici :

 public class Download extends ActionSupport implements SessionAware, ServletResponseAware { @Setter private Map session; @Setter private HttpServletResponse response; public Ssortingng execute(){ ServletOutputStream os = null; try { session.put("DOWNLOAD_STATUS","active"); response.setContentType("myContentType"); response.addHeader("Content-Disposition", "attachment; filename=\"foo.bar\""); os = response.getOutputStream(); IOUtils.copy(getMyFileInputStreamSomeHow(), os); } finally { IOUtils.closeQuietly(os); session.put("DOWNLOAD_STATUS","finished"); } return NONE; } } 

Vous pouvez également demander au navigateur de dessiner une barre de progression en spécifiant l’en Content-Length tête de réponse Content-Length ( response.setHeader("Content-Length", 1337); ) comme décrit ici , où vous pouvez également voir un mécanisme similaire pour empêcher les téléchargements simultanés. .

Dans IsDownloadFinished.action , vous devez vérifier l’atsortingbut de session. Si elle n’existe pas ou est différente de la version finale, cela signifie que le téléchargement n’a pas encore commencé ou n’a pas encore commencé, et ne fait donc rien. Sinon, renvoyez un httpheader réussi qui fera que votre fonction jQuery $ .ajax exécute le success: callback. Vous pouvez utiliser httpHeader ou json , comme décrit ici :

 @Results({ @Result(name = ActionSupport.SUCCESS, type="httpheader", params = {"status", "200"}), @Result(name = ActionSupport.ERROR, type="httpheader", params = {"error", "500"}) }) public class IsDownloadFinished extends ActionSupport implements SessionAware { @Setter private Map session; public Ssortingng execute(){ if ("finished".equals(session.get("DOWNLOAD_STATUS")) { session.remove("DW_STATUS"); return SUCCESS; } return ERROR; } } 

Il existe différentes solutions à ce problème, je vous ai montré la plus simple.
Des solutions plus élégantes et complexes impliqueraient des requêtes de longue durée et des techniques Comet (lire: WebSocket), mais je suppose que vous pouvez commencer avec le polling-timer de cet exemple de lancement, en le personnalisant pour vos besoins et éventuellement en le faisant évoluer à l’aise avec l’argument.