2009-05-07 9 views
5

J'ai besoin d'une solution multi-navigateur pour le cas d'utilisation suivant: L'utilisateur clique sur un bouton "Exporter" sur une de nos pages, ce qui ouvre un popup avec un formulaire. Lors de la soumission du formulaire, l'utilisateur devrait recevoir un téléchargement de fichier binaire (un fichier CSV, par exemple), et le popup devrait se fermer sans changer le contenu visible de la fenêtre parent.Comment fournir (dans IE et Firefox) un téléchargement de fichier binaire dans un popup qui se ferme?

Nous ne pouvons pas utiliser un timeout pour fermer le popup, car il y a généralement une boîte de dialogue demandant à l'utilisateur comment manipuler le fichier avant de le télécharger, et il n'y a aucun moyen de savoir combien de temps il faudra .

, nous avions un script dans le menu contextuel qui fixe window.location à l'URL du fichier de téléchargement. Cela laisse la popup non fermée. Ensuite, j'ai essayé de placer un iFrame caché dans la fenêtre parente et de faire en sorte que le popup place le src de l'iFrame dans l'URL de téléchargement avant d'appeler self.close(). Cela fonctionne parfaitement dans Firefox, mais IE le supprime complètement avec des restrictions de sécurité.

Y a-t-il une bonne façon de procéder? Que diriez-vous d'une façon qui fonctionne sur IE?


Mise à jour - problème résolu

Les réponses proposées ici ne sont pas trop loin, mais mon problème était un peu plus complexe que d'être simplement un problème Javascript. J'ai rencontré des bugs avec IE et Excel (puisque le fichier de téléchargement est CSV), et la popup faisait un post de formulaire.

Je ne pouvais pas résoudre le problème sans ajouter les données de formulaire à une URL (pour un GET au lieu d'un POST), et je dois définir le site comme confiance dans IE (il s'agit d'une application d'entreprise demande de faire des utilisateurs).

Sur le clic du bouton de formulaire, la fenêtre contextuelle appelle une fonction sur window.opener, en passant sous la forme et son URL d'action. Ensuite, le popup appelle window.close(). La fonction ajoute les données du formulaire à l'URL et définit window.location à la nouvelle URL (l'idée iFrame n'a jamais bien fonctionné dans IE et n'était apparemment pas nécessaire).

Dans la réponse à l'URL du formulaire, les en-têtes de demande comprennent Content-Type: application/octetstream et Content-Disposition "" l'attachement; filename = nomfichier.csv ».

+0

serait-il travailler pour soit mettre le formulaire sur la page d'origine ou diriger la nouvelle page à ouvrir dans un iframe (qui pourrait être généré à partir du script lui-même)? – Anonymous

+0

En réponse à Anonymous - Je pense que ce que vous décrivez est en quelque sorte ce que j'ai fait. Le popup, lors de la création et du chargement initial, écrit un iFrame invisible dans la page parente. Lorsque le formulaire est soumis dans le popup, il dirige l'iFrame pour charger le fichier de téléchargement. Mon IE (IE 6) a bloqué ceci et m'a forcé à confirmer le téléchargement dans la fenêtre parente. Lors de la confirmation, il essaie de soumettre à nouveau le formulaire de la fenêtre parent, ce qui ouvre une autre boîte de dialogue de confirmation et, en général, le désactive. –

+0

Je pensais soumettre le formulaire à un iframe, qui élimine le problème persistant de popup. – Anonymous

Répondre

0

Cela pourrait être la façon d'aborder le problème.

1) sous forme Popup onsubmit fait un window.open à une troisième fenêtre qui ouvre une page qui est une page vierge renvoie simplement le fichier téléchargé.

2) Dans votre javascript sur le formulaire popup, juste après que vous faites le window.open, appelez votre fenêtre parent (la méthode 1ère fenêtre) qui ferme la fenêtre présenter sous forme.

3) Sur la troisième page, qui est juste la page qui retourne le fichier, vous le contenu-disposition dans votre fichier d'en-tête juste pour retourner le fichier et noth Sinon, la page ne s'ouvrira pas vraiment.

Voici quelques informations sur l'en-tête dont vous pourriez avoir besoin. Le code est en ASP préhistorique classique, mais vous devriez pouvoir luire ce dont vous avez besoin.

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

espoir qui aide.

+0

Je ne suis pas sûr que l'étape 1 fonctionnerait dans mon cas, car la soumission de formulaire dans la popup génère réellement le fichier à télécharger et le nomme. Jusqu'à ce que j'obtienne les résultats de cette soumission, je ne peux pas ouvrir la troisième fenêtre parce que je ne connais pas l'URL de téléchargement. C'est un problème résolu, mais j'espérais ne pas avoir à toucher à la servlet de téléchargement de fichiers elle-même, car il s'agit d'une correction de bogue à la fin de notre cycle de développement. –

1

Avez-vous essayé, dans la solution iframe, d'appeler réellement une méthode dans la fenêtre parente, qui définira à son tour l'emplacement de l'iframe? Je demande parce que cela a fonctionné dans mes tests:

Parent fenêtre

<html> 
<head> 
<script type="text/javascript"> 
var w; 

var download = function() { 
    document.frames[0].location = "test.php"; 
    w.close(); 
}; 

var o = function() { 
    w = window.open("test2.html", "window_name"); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return o();">open</a> 

<iframe></iframe> 

</body> 
</html> 

Fenêtre popup

<html> 
<head> 
<script type="text/javascript"> 
var download = function() { 
    window.opener.download(); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return download();">download</a> 

</body> 
</html> 

test.php est juste une page qui force un fichier pour le téléchargement, et s'il vous plaît noter que le code ci-dessus est spécifique à IE car j'utilise l'objet document.frames, mais il peut être facilement fait cross-navigateur.

+0

Au moment de la génération de la page parent, l'URL de téléchargement du fichier est inconnue. Je suppose qu'il pourrait être passé à la fonction download(). Je vais devoir essayer cela (début de la semaine prochaine, en raison de mon emploi du temps). –

+0

Mettre la fonction download() dans l'ouvreur n'a pas arrangé les choses. IE bloque toujours et gêne complètement le processus de téléchargement. La prochaine étape pour moi est d'essayer de charger le formulaire dans l'iFrame plutôt que dans le popup. –

+0

Quelle version d'IE? –

-1

Il n'y a pas de solution parfaite pour cela. Lorsque le fichier de téléchargement dans IE sa popup et dans Firefox il téléchargé directement