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

Struts 2 Java Discussion :

Download de fichier


Sujet :

Struts 2 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut Download de fichier
    Bonjour, je rencontre actuellement des problemes dans le téléchargement de fichiers avec Struts 2.

    Voici le code que je réalise :

    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
     response.flushBuffer();
     
                	ServletOutputStream outputStream = response.getOutputStream();
                      byte[] rb = currentCategory.getNouveau();
                      outputStream.write(rb, 0, rb.length);
     
                      String propsPath = request.getSession()
                                                .getServletContext()
                                                .getRealPath("") +
                          File.separator + "WEB-INF" + File.separator +
                          "classes" + File.separator +
                          "tablemapping.properties";
                      InputStream conf = new FileInputStream(propsPath);
                      Properties db_prefs = new Properties();
                      db_prefs.load(conf);
     
                      String mimeType = db_prefs.getProperty(
                              "table.category.column.Nouveau.mimetype");
                      response.setContentType(mimeType);
                      response.setHeader("Content-Disposition",
                          "filename=nouveau" +
                          this.getFileExtension(mimeType));
    Mon problème est que lorsque je lance le téléchargement, la fenêtre s'affiche correctement mais le nom du fichier est monAction.action ....

    Mais si je le télécharge et que je le renomme avec la bonne extension cela fonctionne. J'ai essayé de faire le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    response.setContentType(mimeType);
    response.setHeader...
    en premier mais j'ai le même résultat

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut
    Pour downloader un fichier j'utilise la méthode suivante :

    créer une action dans struts.xml avec un result de type stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <action name="DownloadFile" class="actions.DownloadFile">
      <result name="success" type="stream">
        <param name="contentType">application/download</param> 
        <param name="inputName">inputStream</param> 
        <param name="bufferSize">1024</param>
        <param name="contentDisposition">attachment;filename=${fileName}</param>
        <param name="contentLength">${fileSize}</param>
      </result>
    </action>
    Dans la classe action DownloadFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public class DownloadFile extends ActionSupport{
      private InputStream inputStream;
      private String fileName;
      private String fileSize;
      //... plus les get / set qui vont avec
     
      public String execute(){
        fileName = le nom du fichier;
        fileSize = la taille du fichier;
        inputStream = new FileInputStream(chemin du fichier);
      }
    }
    Comme ça le navigateur ouvre un popup avec le nom du fichier à télécharger, et avec la taille du fichier il peut afficher la barre de progression.

  3. #3
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Essaye ca (attachement pour forcer le telechargement, et filename pour le nom du fichier à donner par defaut au fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentDisposition("attachment;filename=document.pdf")
    par contre je ne comprends pas comment tu arrives à télécharger ton fichier car la méthode que tu donnes ne devrait pas marcher avec STRUTS 2 mais seulement STRUTS 1.

  4. #4
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Déterrage
    Bonjour tout le monde

    Je me permet de déterrer ce topic car je rencontre un problème lors du téléchargement d'un fichier XML.

    Actuellement je souhaite utiliser Apache FOP pour créer des fichiers XML et PDF à partir d'objets. Pour le moment je teste seulement la génération et le téléchargement d'un XML.

    Mon problème : Je sais que la génération du fichier fonctionne, mais il n'est jamais proposé au téléchargement.

    Mon action a cette forme dans le fichier struts.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action name="exportAsXML" method="exportAsXML" class="com.mycompany.product.struts.actions.MetriqueListAction">
    	<result name="success" type="stream">
    		<param name="inputName">xml</param>
    		<param name="contentType">application/download</param>
    		<param name="contentDisposition">attachment;filename="export.xml"</param>
    		<param name="bufferSize">1024</param>
    	</result>
    </action>
    La classe ressemble à ceci (juste un extrait) :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class MetriqueListAction extends AbstractArianeAction
    {
    	private static Logger logger = Logger.getLogger(MetriqueListAction.class);
    	[ ... ]
    	private File xml;
    	[ ... ]
    	public String exportAsXML()
    	{
    		if (logger.isDebugEnabled())
    		{
    			logger.debug("Methode exportAsXML");
    		}
    		try
    		{
    			xml = new File("ResultObj2XML.xml");
    			OutputStream out = new java.io.FileOutputStream(xml);
    			out = new java.io.BufferedOutputStream(out);
     
    			TransformerFactory factory = TransformerFactory.newInstance();
    			Transformer transformer = factory.newTransformer();
     
    			/*
    			 * Objet contenant le document à exporter.
    			 */
    			ExportDocument document = new ExportDocument();
     
    			/*
    			 * getSourceForExportDocument réalise la création de la source
    			 * depuis la méthodes parse, et etc...
    			 */
    			Source src = document.getSourceForExportDocument(getLocale());
     
    			// Setup output
    			Result res = new StreamResult(out);
     
    			// Start XSLT transformation
    			transformer.transform(src, res);
    			out.close();
    			return SUCCESS;
    		} catch (Exception e)
    		{
    			logger.error("Listing objects failed", e);
    			return ERROR;
    		}
    	}
    	[ ... ]
    	public InputStream getXml()
    	{
    		try
    		{
    			logger.debug("xml=" + xml.getCanonicalPath());
    			InputStream is = new FileInputStream(xml);
    			return is;
    		} catch (Exception e)
    		{
    			logger.error("bug", e);
    			return null;
    		}
    	}
    Le logger.debug de getXml() me renvoie le chemin_sur_ma_machine/ResultObj2XML.xml

    Je me demande si ça ne vient pas de là, j'avoue ne pas être à l'aise avec la manipulation des Stream...
    Quelqu'un a une idée ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Le contenu de ton fichier de sorti doit être mis dans une variable de type InputStream nommée par exemple inputStream au niveau de ton Action.

    Ensuite au niveau de ton action dans le struts.xml tu dois avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action name="exportAsXML" method="exportAsXML" class="com.mycompany.product.struts.actions.MetriqueListAction" >
         <result name="success" type="stream">
              <param name="inputName">inputStream</param>
              <param name="contentType">application/octet-stream</param>
              <param name="contentDisposition">filename="export.xml"</param>
              <param name="bufferSize">1024</param>
         </result>
    </action>

  6. #6
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    Bonjour kiwwi209, et merci de t'intéresser à mon problème.

    Citation Envoyé par kiwwi209 Voir le message
    Le contenu de ton fichier de sorti doit être mis dans une variable de type InputStream nommée par exemple inputStream au niveau de ton Action.
    En fait c'est à peu prés ce que je fais, seulement au lieux d'avoir une variable(attribut) de type InputStream appelée inputStream (qui est juste la valeur par défaut il me semble), j'ai un attribut de type File appelé xml.

    Et dans la fonction getXml(), comme tu peux le voir, je retourne le FileInputStream créé à partir de mon fichier xml.

    J'ai essayé de changer le contentType pour application/octet-stream et contentDisposition pour filename="export.xml" mais cela ne change rien.
    J'ai également fait afficher dans le log le contenu du FileInputStream retourné par la fonction getXml(), et les données sont correctes, j'ai le code XML cohérent.

    Il faut vraiment que mon attribut soit de type InputStream et que je le retourne tel quel ? Ou le fait d'avoir un File et de retourner par un petit traitement l'InputStream "associé" fonctionne aussi ?
    Je n'en verrais pas la raison, mais c'est toujours possible...

    Merci encore

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Citation Envoyé par arnaud.tlse Voir le message
    Il faut vraiment que mon attribut soit de type InputStream et que je le retourne tel quel ? Ou le fait d'avoir un File et de retourner par un petit traitement l'InputStream "associé" fonctionne aussi ?
    Je n'en verrais pas la raison, mais c'est toujours possible...
    Ma problématique initiale était un fichier Excel à télécharger et je passant par un File comme tu le fais je n'ai pas trouvée d'issue. Le type de ta variable doit être InputStream il n'y a que quand j'ai apporté cette modification à mon source d'origine que ça a fonctionné. Maintenant pourquoi ?.... J'avoue que je n'en sais rien et je n'ai pas eu le temps de me pencher plus en avant pour analyser le pourquoi dans le fonctionnement de Struts2...

  8. #8
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    C'est effectivement bien de là que vient le problème, j'ai testé la même opération en récupérant une image du projet par l'appel à la méthode getResourceAsStream de la classe ClassLoader.
    Avec mon fichier xml je renvoie un FileInputStream, et avec l'image je renvoie un BufferedInputStream.
    Dans les deux cas cela ne fonctionne pas...

    J'ai à côté de moi deux bouquins, dans les exemples l'un indique de renvoyer un "vrai" InputStream par le biais de la fonction getResourceAsStream de la classe ServletContext (et non ClassLoader), et le second indique de renvoyer un ByteArrayInputStream.

    J'essaie les deux de ce pas, et je reviens ici ensuite

    Merci encore !

  9. #9
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Je me sens mauvais...
    Re, c'est re moi.
    Pris en compte tes précédents post, kiwwi209, j'ai donc dans struts.xml, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <action name="exportAsXML" method="exportAsXML" class="com.mycompany.product.struts.actions.MetriqueListAction">
    	<result name="success" type="stream">
    		<param name="inputName">inputStream</param>
    		<param name="contentType">application/octet-stream</param>
    		<param name="contentDisposition">attachment;filename="export.xml"</param>
    		<param name="bufferSize">1024</param>
    	</result>
    </action>
    Puis j'ai changé le nom et le type de mon attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private InputStream inputStream;
    J'ai toujours ma méthode exportAsXML qui instancie inputStream :
    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
    public String exportAsXML()
    {
    	if (logger.isDebugEnabled())
    	{
    		logger.debug("Methode exportAsXML");
    	}
     
    	OutputStream out = null;
    	try
    	{
    		File xmlfile = new File("ResultObj2XML.xml");
    		out = new java.io.FileOutputStream(xmlfile);
    		out = new java.io.BufferedOutputStream(out);
    		TransformerFactory factory = TransformerFactory.newInstance();
    		Transformer transformer = factory.newTransformer();
     
    		Source src = document.getSourceForExportDocument(getLocale());
     
    		// Setup output
    		Result res = new StreamResult(out);
     
    		// Start XSLT transformation
    		transformer.transform(src, res);
     
    		// ICI
    		inputStream = new FileInputStream(xmlfile);
    	}
    	catch (Exception e)
    	{
    		logger.error("Listing objects failed", e);
    		return ERROR;
    	}
    	finally
    	{
    		try
    		{
    			out.close();
    		}
    		catch (IOException e)
    		{
    			logger.error("output stream close failed", e);
    		}
    	}
    	return SUCCESS;
    }
    Et enfin la méthode getInputStream() pour laquelle j'ai essayé deux choses, d'abord de renvoyer l'objet tel quel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public InputStream getInputStream()
    {
    	logger.debug("getInputStream");
    	return inputStream;
    }
    Ce qui ne fonctionne pas...
    Et j'ai également essayé de renvoyer un ByteArrayInputStream créé depuis inputStream :
    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
    public InputStream getInputStream()
    {
    	logger.debug("getInputStream");
    	try
    	{
    		byte[] octets = new byte[inputStream.available()];
     
    		inputStream.read(octets);
    		return new ByteArrayInputStream(octets);
    	}
    	catch (Exception e)
    	{
    		logger.error("bug", e);
    		return null;
    	}
    }
    Ce qui ne fonctionne pas non plus !

    Comme le dit si bien Milla Jovovich : "Please !"

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Je pense que ton erreur vient de là :
    Citation Envoyé par arnaud.tlse Voir le message
    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
    public String exportAsXML()
    {
        if (logger.isDebugEnabled())
        {
            logger.debug("Methode exportAsXML");
        }
    
        OutputStream out = null;
        try
        {
            File xmlfile = new File("ResultObj2XML.xml");
            out = new java.io.FileOutputStream(xmlfile);
            out = new java.io.BufferedOutputStream(out);
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
    
            Source src = document.getSourceForExportDocument(getLocale());
    
            // Setup output
            Result res = new StreamResult(out);
    
            // Start XSLT transformation
            transformer.transform(src, res);
    
            // ICI
            inputStream = new FileInputStream(xmlfile);
        }
        catch (Exception e)
        {
            logger.error("Listing objects failed", e);
            return ERROR;
        }
        finally
        {
            try
            {
                out.close();
            }
            catch (IOException e)
            {
                logger.error("output stream close failed", e);
            }
        }
        return SUCCESS;
    }
    car là tu crées effectivement un InputStream à partir de ton xmlfile sauf que ton xmlfile y a pas grand chose dedans... car tout ton travail de transformation ne se fait pas dans le xmlfile.

  11. #11
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Résolu
    C'est encore moi !

    Citation Envoyé par kiwwi209 Voir le message
    tu crées effectivement un InputStream à partir de ton xmlfile sauf que ton xmlfile y a pas grand chose dedans... car tout ton travail de transformation ne se fait pas dans le xmlfile.
    Je confirme que les données se trouvent bien dans xmlfile, et pour cause, j'ai résolu le problème. Comme je l'ai dit, je ne suis pas très au point sur les Input/OutputStream et tout ce qui y touche, cependant il me semble que je remplis le OutputStream (nommé ici "out") qui est lié au fichier non ?
    En tout cas le problème ne venait absolument pas de là.

    En désespoir de cause j'avais même essayé de surcharger la classe Result et me créer un nouveau type de sortie que j'ai appelé XmlResult , et dedans je faisais la même chose que dans exportAsXml sauf que je remplissait directement le response.getOutputStream sans passer par un File (ce qui est peut-être plus propre en y repensant).
    Bon, en tout cas, ça ne fonctionnait pas non plus, alors je suis allé voir du côté de l'appelant de l'action, à savoir ma page web.

    L'action était déclenchée par le clic sur un bouton que voici (je précise que j'utilise Dojo Toolkit) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <s:url action="exportAsXML" id="exportAsXML" />
    <sx:submit href="%{exportAsXML}" key="global.export" />
    Et c'est de là que venait le problème, en utilisant un bête lien plutôt qu'un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <s:url action="exportAsXML" id="exportAsXML" />
    <a href="%{exportAsXML}"><s:text name="global.export"/></a>
    Le problème est résolu, mon fichier export.xml est bien proposé au téléchargement.

    Tout ça pour ça !?! Bin ouais... Mais au moins j'aurais appris plein de choses !
    Et puis je lâche pas l'affaire, moi je veux mon bouton ! Mais maintenant je sais au moins que c'est du côté de Dojo qu'il faut que je regarde, et pas Struts2.

    Merci beaucoup à toi kiwwi209 !

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    cool !
    Pour le DOJO j'peux pas t'aider, je ne le connais pas du tout...
    J'espère que quelqu'un pourra te venir en aide sur ce point.

  13. #13
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Nouveau déterrage de topic
    Bonjour à tous

    Je déterre de nouveau ce topic pour apporter ma petite contribution finale.
    Dans les post précédents je soulignais le fait que mon action (génération d'un fichier XML) déclenchée par un bouton ne produisait aucun résultat alors que lorsqu'elle est déclenchée par un lien <a></a> la popup de téléchargement s'ouvre.

    Je suis revenu à la charge récemment sur ce problème et y ai trouvé une solution qui, bien que pas très propre, a le mérite de fonctionner.
    Suspens... J'utilise une frame ! Pouin pouin pouin pouin....

    Et oui, l'appel via le bouton <sx:submit> effectue un appel AJAX qui recharge la balise contenant, alors que le lien <a> recharge la page.

    Du coup l'introduction de la frame règle le problème puisque c'est à elle qu'on va donner l'adresse du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <!-- iFrame invisible dont l'attribut src sera renseigné au moment de l'appel -->
     
    <iframe id="myFrame" src="" style="visibility:hidden;width:0px;height:0px;"></iframe>
    Et du côté du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <sx:submit onclick="document.getElementById('myFrame').src='exportAsXML.action';" />
    Et voilà, dans la définition de l'action dans struts.xml on change le type de contenu renvoyé par application/download :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <param name="contentType">application/download</param>
    Ou par application/pdf dans le cas d'un PDF, ou autre si vous voulez tester autre chose

    C'est tout pour moi, bonne continuation à tous

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/12/2005, 12h04
  2. download de fichier depuis un serveur web
    Par minusette dans le forum Modules
    Réponses: 9
    Dernier message: 14/10/2005, 09h10
  3. [Javabean/sun.net.ftp] Downloader un fichier txt
    Par benben13 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 13/09/2005, 16h43
  4. [C#] Download de fichier
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/06/2005, 10h09
  5. [VB.NET] Download de fichiers sur un serveur...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 19/05/2004, 10h25

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