2 votes

Une solution élégante pour les téléchargements automatiques

J'utilise actuellement la méta http-equiv='Refresh' pour lancer automatiquement les téléchargements de PDF. Cependant, l'effet est différent sur chacun des navigateurs.

Le principal problème est qu'avec IE (6 et 7), une fois que l'utilisateur est redirigé vers le PDF, s'il clique sur le bouton "retour", il est renvoyé à la page qui a déclenché le téléchargement, puis il est à nouveau redirigé vers le PDF.

Firefox sous Windows a un meilleur effet mais n'est toujours pas parfait : l'utilisateur arrive à la page de téléchargement et est redirigé vers le PDF. Cependant, s'il utilise le bouton retour, il rate complètement la page de téléchargement.

Actuellement, Firefox sous Linux a l'effet exact que je souhaite. La page de téléchargement vous redirige vers le PDF et le bouton retour du PDF vous renvoie à la page de téléchargement et vous y restez.

J'ai essayé d'utiliser la fonction javascript setTimeout() pour retarder l'apparition d'une fenêtre pop-up du PDF, mais le délai ne semble fonctionner dans aucun navigateur et la fenêtre pop-up ne semble pas fonctionner dans IE7.

Quelqu'un a-t-il mis en œuvre une solution élégante à ce problème que je pourrais utiliser ?

Merci d'avance pour votre aide

1voto

Georg Schölly Points 63123

Référent

Vous pouvez vérifier le référent :

if (document.referrer != "http://homepage.com/file.pdf") {
    // go to the file
}

C'est un peu plus complexe parce que vous devez comparer à l'URL absolue du référent, mais cela ne devrait pas poser de problème.

Cookies

Vous pourriez définir un cookie la première fois que vous accédez à la page de téléchargement. Si le cookie est défini (pour chaque fichier une autre entrée dans le cookie) alors vous ne devriez pas faire de redirection.

L'inconvénient est que si quelqu'un recharge la page (parce qu'il veut voir le fichier une deuxième fois), il ne peut plus accéder au fichier. Il existe quelques possibilités de contourner ce problème :

  • Définir un horodatage qui expire dans le cookie.
  • Ajoutez un lien vers la page que l'utilisateur peut cliquer manuellement.

Définir/obtenir un cookie :

if (document.cookie && document.cookie == "I was here!") {
    alert(document.cookie);
} else { // set a cookie
    document.cookie = "I was here!";
}

Javascript peut rediriger comme ceci :

window.location.href = "http://www.google.com";

0voto

tpk Points 823

Utiliser une popup en javascript

de cette façon, lorsque l'utilisateur accède au pdf, il se trouve dans un autre navigateur, que vous pouvez fermer. une fois que vous avez fait cela, vous pouvez continuer à naviguer sur le site.

0voto

Sergii Points 6082

Si j'ai bien compris ton besoin, tu veux faire quelque chose comme comportement de partage de fichiers : l'utilisateur attend quelques secondes avec un compteur et après le délai d'attente, vous le redirigez vers la page qui lance le téléchargement.

Peut-être que vous devriez simplement montrer le lien à la page de téléchargement au lieu de la redirection ? Cette page devrait envoyer des en-têtes "force-download" pour éviter que le navigateur ne navigue dessus. Si quelqu'un essaie d'accéder directement à cette page, vérifiez le référent ou les en-têtes ou toute autre protection que vous pouvez imaginer (comme les liens dynamiques), peut-être en avez-vous déjà une.

Cette solution vous permettra d'éviter la magie JS et devrait rendre votre code cross-browser sans problèmes.

0voto

joegester Points 77

Vous pouvez ajouter un iframe au DOM par le biais de javascript avec src défini à l'url que vous voulez télécharger. Le navigateur ne changera pas de page du tout, le téléchargement commencera simplement. Il peut être caché à l'aide de CSS et l'utilisateur ne saura même pas qu'il est là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X