Question

J'ai un bouton qui définit window.location dans un fichier php qui génère un flux qui est ensuite téléchargé. Toutefois, la taille des fichiers étant variable en fonction des données insérées dans le flux, cela peut parfois prendre du temps, du clic sur le bouton à la boîte de dialogue de fichier qui s’ouvre.

Ce que j'aimerais pouvoir faire, c'est cliquer sur le bouton et afficher un fichier loading.gif jusqu'à ce que la boîte de dialogue / le fichier soit terminée.

Toutes les idées seraient cool!

A bientôt

Était-ce utile?

La solution

Assurez-vous que le script de génération RSS affiche l'image souhaitée (le code HTML de l'image de sortie, puis videz le tampon de sortie et démarrez la génération de données). À la fin de la génération de données, faites:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

C'est tout.

Autres conseils

Je ne sais pas vraiment pourquoi vous devez vérifier la taille du fichier. Si vous utilisez ajax pour effectuer dynamiquement le get / post, et que vous essayez simplement d'afficher une icône de chargement pendant que cela se produit, il est assez simple de générer un indicateur d'activité asynchrone. Par exemple, avec jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

Le code ci-dessus définit un objet DOM avec l'id "chargement". pour afficher et masquer chaque demande asynchrone lancée et arrêtée. .load (url) charge le contenu de l'URL dans la div #feeds. Si vous définissez l'en-tête content-disposition: attachment avec php, il lancera automatiquement une fenêtre de téléchargement de fichier, même s'il a été chargé de manière asynchrone dans un div. Ceci est également possible sans jquery bien sûr, il y a juste un tas de javascript compatible avec les navigateurs et ce n'est pas aussi simple que de simplement s'inscrire aux événements ajaxStart et ajaxStop pour afficher et masquer votre chargement img.

Josh

avant de configurer window.location, vous pouvez afficher un div caché avec votre gif

C'est vieux jeu, mais cela peut être fait très facilement avec le serveur push

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

Ajustez simplement les types de contenu pour les données que vous envoyez. $ separator peut être n'importe quelle valeur tant qu'elle n'apparaît pas dans les données envoyées.

Une méthode que j'ai déjà utilisée dans le passé fonctionne de la sorte ...

  • Définissez window.location sur une page de chargement et transmettez la page de destination dans la chaîne de requête. La page de chargement doit afficher un gif animé ou ce que vous préférez pour montrer que le traitement est en cours. La page de chargement doit être IMMÉDIATEMENT redirigée vers la page de destination transmise dans la chaîne de requête (avec tous les autres paramètres de chaîne de requête applicables).

EDIT: la page de chargement doit rediriger vers la page de destination à l'aide de javascript (définissez window.location sur l'URL fournie dans la chaîne de requête). Ceci est un point important, car si vous redirigez le serveur, la page de chargement ne sera pas affichée.

EDIT 2: Si votre page de chargement est un fichier php, vous pouvez vérifier la taille du fichier à télécharger et afficher une durée estimée de téléchargement pour l'utilisateur (avec un "chargement" animé, ou autre).

  • La page de destination doit être rendue avec la mise en tampon activée (appelez ob_start () avant de rendre le contenu). Lorsque la mise en mémoire tampon est activée, rien n'est envoyé au navigateur jusqu'à ce que la page entière soit rendue. Pendant ce temps, votre page de chargement de l'étape 1 continuera à s'afficher.

Vous devrez utiliser AJAX pour communiquer avec le serveur afin de connaître la taille exacte du fichier que vous téléchargez. Ensuite, vous avez quelque chose à tester. Il n’existe aucun moyen de connaître la taille de la charge utile attendue uniquement du côté client.

Vous est-il possible d'utiliser un iframe pour charger le fil, puis de vérifier l'état de disponibilité de l'iframe / du document à l'aide d'un intervalle? Donc, le processus serait:

  • Charge une fenêtre contenant un iframe de largeur et hauteur 100% et un chargement.gif sur l'iframe.
  • Définir une minuterie pour la vérification de la propriété iframe.contentWindow.document.readyState
  • Une fois que readyState == est terminé, affichez le dialogue de sauvegarde du fichier.

Un inconvénient est que, pour la plupart des navigateurs, le fichier PHP doit se trouver sur le même domaine (sur IE, vous pouvez simplement vérifier la propriété readyState de l'iframe).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top