IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Provoquer le téléchargement d'un pdf


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut Provoquer le téléchargement d'un pdf
    J'explique mon problème:

    J'ai une page web avec un bouton qui déclenche, via un appel en ajax la création d'un pdf sur le serveur. Ce que je voudrais, c'est qu'à la suite du click sur le bouton, la boite de dialogue qui propose d'ouvrir ou de sauver le fichier que je viens de générer s'affiche.

    Pour le moment, j'ai réussi à faire marcher le truc sous Firefox en utilisant une iframe invisible dont la source pointe sur un proxy qui me retourne le fichier avec le header qui va bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        ...
        var handle = function (strFileName){
     
        // recupere le nom du rapport généré
        var url = "./ReportDesigner?id=" + strFileName;
     
     	if (window.ActiveXObject){
     
       		var a = document.createElement("a");
    		document.body.appendChild(a);
    		a.href = url;	
    		a.target = "_blank";
    		a.onclick = function(){
    			alert(this.href);
    			return true;
    		}
    		a.click();
    	}
       	else{
     
         	         // supprime l'ancienne iframe si elle existait
          	         var oldIFrame = $("displayReportIFrame");
         	         if (oldIFrame) 
         		     oldIFrame.parentNode.removeChild(oldIFrame);
     
         	         // crée la nouvelle iframe
         	         var iframe = document.createElement("iframe");
         	         iframe.id = "displayRaportIFRame";
         	         iframe.src = url;
    	         iframe.style.width  = "0px";
    	         iframe.style.height = "0px";
     
    	         //iframe.style.display = "none";
    	         $("reportDesignerMainLayout").appendChild(iframe);
    	}
     
         }
     
         new Ajax.Request("ReportDesigner",{
         	method 	  : "post",
         	postBody  : "design=" + root.xml + "&fileName=" + fileName + "&userId=1",
         	onSuccess : function(xhr){						
                                 handle(xhr.responseText); //responseText contient le nom du fichier généré
         			 }
         });
     
     }
    et sur le serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    				// met les headers qui vont bien
    				response.setContentType("application/pdf");	
    				//response.setHeader("Cache-Control","no-store, must-revalidate, post-check=0, pre-check=0");
    				//response.setHeader("Pragma","no-cache");
    				//response.setDateHeader("Expires",System.currentTimeMillis() + 10*60*1000);				
    				//response.setIntHeader("Expires", 0);
    				response.setHeader("Content-Disposition","attachement; filename=rapport.pdf");
    Le problème, c'est que comme d'habitude cette daube d'ie ne gere pas/gere mal le header Content-Disposition.
    J'ai tenté une autre méthode sous ie, parce que hier il me semble que j'arrivais a ouvrir la boite de dialogue de cette façon mais depuis, avec tout ce que j'ai testé, j'arrive plus a me souvenir comment je faisais ^^

    Donc ma question, c'est n'y aurait-il pas un moyen plus simple d'arriver au même résultat. Clairement mon problème la, c'est les headers que ie ne gere pas, mais si quelqu'un autre solution que celle de l'iframe, je suis preneur.

    ps: et même s'il me trouve la bonne combinaison de headers, je suis preneur ^^

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    c'est coté php que ça se passe avec le header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Header("Content-disposition: attachment: filename=".$row['data_fichier']);
    		  Header("Content-type: ". $row['type_fichier']);
    avec le nom du fichier et le type mime ... et pas de content type ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    En fait, le problème c'est que sous IE, le navigateur m'affiche directement le pdf, or moi je voudrais la boite de dialogue.

    Ta solution ne change rien pour moi, toujours le pdf directement dans le navigateur.

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Par défaut
    choix du client...
    Que ce soit ie ff ou autre, on peut heureusement paramétrer pour dire ce qu'on fait avec les données recues.

    PS : déactive les activex et compagnie et tu auras ta boite de dialogue.

  5. #5
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Tain l'arnaque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setHeader("Content-Disposition","attachment; filename=rapport.pdf");
    au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setHeader("Content-Disposition","attachement; filename=rapport.pdf");
    Comment paumer une journée et passer pour un con

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment provoquer le téléchargement d'un fichier?
    Par PerpetualSnow dans le forum ASP.NET
    Réponses: 6
    Dernier message: 21/08/2009, 10h44
  2. Problème de Téléchargement d'un pdf
    Par air75 dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2009, 22h29
  3. Proposer le téléchargement de fichiers PDF
    Par Amel_B dans le forum Langage
    Réponses: 15
    Dernier message: 29/04/2009, 10h51
  4. [FPDF] téléchargement forcer de pdf
    Par musicann dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 08/01/2009, 12h18
  5. Mettre à disposition le téléchargement d'un pdf
    Par Deallyra dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2007, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo