2009-04-07 5 views
7

Je suis à la recherche de plus de réflexions sur la meilleure façon d'initier un téléchargement de fichier à partir de Javascript.Lancement d'un téléchargement de fichier qui fonctionne bien, même dans IE?

Best way to initiate a download? a beaucoup de bonnes idées qui peuvent se résumer ainsi:

  • Réglez le src sur une iframe
  • Utilisez window.location.replace()
  • Utilisez une page avec un en-tête de meta refresh
  • Utilisez un window.open()
  • Laissez le serveur de fichiers directement sortie, réglage du Content-type et Content-Disposition

Toutes ces approches fonctionnent bien pour les navigateurs avec lesquels j'ai testé, sauf pour IE8. Avec IE8, je reçois un tas de problèmes:

  • Le iframe ne fonctionne pas à cause de cookies par l'environnement que je utilise. Je pense que je devrais activer les en-têtes P3P pour résoudre ceci, mais l'environnement ne me permet pas de placer des en-têtes, ainsi P3P est dehors
  • Le window.location.replace() fonctionne excepté cela dans IE8, le barre d'adresse de la fenêtre change à l'URL du fichier et la fenêtre sous-jacente est vide Une fois le fichier téléchargé est ouvert
  • l'approche meta refresh fonctionne également, mais encore la barre d'adresse change à l'URL du fichier et la fenêtre sous-jacente est vide après le téléchargement des fichiers
  • Je tente désespérément d'éviter window.open() à esquiver un bloc de popup ker problèmes
  • L'environnement du serveur que je suis ne vous permettra pas de sortir le fichier lui-même, comme vous pouvez le faire à dire, l'objet de réponse de ASP.NET

Je n'ai même pas essayé ces méthodes avec IE6 ou IE7, donc il peut y avoir d'autres surprises là-bas. Donc, est-ce que quelqu'un a d'autres suggestions pour lancer un téléchargement dans IE, où (1) pas de popups sont impliqués et (2) le fichier peut être sauvegardé ou ouvert et (3) aucune fenêtre vide est laissée, (3) en utilisant juste Javascript, HTML et une URL à un fichier?

Denver Mike

+0

Pourriez-vous élaborer sur l'environnement du serveur? –

+0

Hi Joel, Ceci est conçu pour fonctionner sur les serveurs Salesforce.com - ils ont leur propre langage de programmation appelé Apex. –

Répondre

5

Le schéma habituel pour une page de téléchargement fichier (si vous devez avoir un, personnellement, je les déteste) est soit:

<script type="text/javascript"> 
    window.onload= function() { 
     window.location= document.getElementById('downloadlink').href; 
    } 
</script> 
<p> 
    Your download will begin shortly. If it doesn't, 
    <a id="downloadlink" href="file.zip">click here</a>. 
</p> 

Ou la même chose avec une méta-refresh à la place du script. De toute façon devrait se comporter à peu près la même chose.

L'approche meta refresh fonctionne également, mais encore la barre d'adresse des modifications à l'URL du fichier et la fenêtre sous-jacente est vide après le fichier téléchargements

Cela ne devrait pas se produire. Y a-t-il une version en ligne qui peut être testée? Normalement, lorsque le navigateur est poussé vers un téléchargement direct de fichier par une méthode normale (lien click, location.href, meta-refresh), il devrait conserver la page précédente à l'écran.

l'environnement ne me permet pas de définir des en-têtes, donc P3P est hors

Vous ne devez pas utiliser les en-têtes pour définir des politiques P3P, un lien HTML <> balise fonctionne aussi bien :

<link rel="P3Pv1" href="/policy.p3p" /> 

Mais pourquoi le feriez-vous? Si l'URL cible ne sert qu'à un fichier, il n'est pas nécessaire de définir un cookie, alors pourquoi s'embêter avec P3P?

J'essaie désespérément d'éviter window.open() pour esquiver les problèmes de blocage des fenêtres contextuelles

Si vous window.open() en réponse à un clic de l'utilisateur, il n'y a pas pop-up problèmes de bloqueur.

Vous n'avez pas besoin d'ouvrir une fenêtre contextuelle pour télécharger un fichier de toute façon. Je commence à penser qu'il y a quelque chose de très étrange à propos de la destination de téléchargement de fichier à laquelle vous liez - comme si ce n'était pas un téléchargement de fichier du tout mais une sorte d'application web HTML bizarre. Lier à un téléchargement n'est pas difficile, il vous suffit de lier le fichier, le travail effectué; vous semblez rendre cela beaucoup plus difficile que cela ne l'est intrinsèquement. Le seul problème habituel avec un simple lien vers un fichier est que s'il contient du texte, HTML, XML ou une image, le navigateur l'affiche en ligne au lieu de le télécharger. La seule façon de contourner cela est d'utiliser l'en-tête 'Content-Disposition: attachment', soit en le servant via un script qui définit cet en-tête, soit en configurant votre serveur web pour envoyer cet en-tête pour tous les téléchargements de fichiers. Si vous ne pouvez pas faire l'un ou l'autre dans votre environnement serveur, il n'y a pas de solution.

+0

Merci beaucoup pour vos commentaires détaillés et d'excellents conseils. J'ai décidé de simplement fournir un lien pour télécharger le fichier et il fonctionne très bien dans tous les navigateurs et évite toute cette complication. –

Questions connexes