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

GWT et Vaadin Java Discussion :

Proposer le téléchargement d'un fichier côté client (GWT)


Sujet :

GWT et Vaadin Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut Proposer le téléchargement d'un fichier côté client (GWT)
    Bonjour à tous,

    Je souhaiterais proposer à l'utilisateur de télécharger un fichier csv dans mon application GWT. Pour l'instant, j'ai créé le fichier et l'ait rempli avec des données bidons. Après l'exécution du ocde ci-dessous, le fichier est bien enregistré sur mon disque dur (emplacement : C:\test.csv)
    Voici le code de ma servlet (côté serveur) :
    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
     
    try {
       StringBuffer buffer = new StringBuffer();
       buffer.append("Employee Code");
       buffer.append(',');
       buffer.append("Employee Name");
       buffer.append(',');
       buffer.append("Employee Address");
       buffer.append('\n');
       ...
       String csv = buffer.toString();
       PrintWriter flux = new PrintWriter(new FileWriter("C:\\test.csv"));
       flux.print(csv);
       flux.close();
    } catch (IOException e) {}
    Comment puis-je faire pour proposer le téléchargement côté client (GWT) ?
    Comment puis-je renvoyer le fichier à ma couche cliente ?
    Comment proposer automatiquement le téléchargement du fichier ?

    J'ai vu pas mal de choses sur le forum. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputStream os = response.getOutputStream();
    response.setContentType("text/csv");
    response.addHeader("Content-disposition", "attachment; filename=\"administrator_config.csv\"");
    os.write(...);
    Mais j'avoue que je n'y comprend pas grand chose.

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Bonjour,

    Tu as deux solutions élégantes à ton problème.

    1 - Utiliser une servlet pour renvoyer ton fichier.
    2 - Ecrire ton fichier dans un espace http public et afficher des simple lien html pour que l'utilisateur les télécharges

    Les deux solutions sont finalement très proche, mais la première solution à l'avantage de pouvoir "sécuriser" tes fichiers en ne donnant accès qu'aux utilisateurs ayant les droits. La seconde à l'avantage d'être plus simple à mettre en place puisque tu n'as finalement pas grand chose à faire (le dossier public existe par defaut en général).

    Le bout de code que tu donnes correspond à la solution 1. Si tu souhaites des explications n'hésites pas à demander.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci pour ta réponse si rapide.

    Je préfèrerai la première solution, en effet, comme ça, l'utilisateur clique sur un bouton "Télécharger", ça fait un appel RPC. Côté serveur, ça construit mon fichier et le renvoie. Ensuite, l'utilisateur obtient automatiquement une fenêtre pour télécharger le fichier .csv
    J'ai en effet pas mal de questions. Le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputStream os = response.getOutputStream();
    response.setContentType("text/csv");
    response.addHeader("Content-disposition", "attachment; filename=\"administrator_config.csv\"");
    os.write(...);
    1) C'est le code qui va dans ma servlet côté serveur. Cependant, l'élément que je renvoie côté client (dans le callback), c'est quoi ? un fichier java.io.File ? le fichier OutputStream os ?
    2) Et ensuite, que dois-je faire côté client (dans mon callback) pour que l'utilisateur voit une fenêtre s'ouvrir automatiquement avec le fichier téléchargeable ?

    Je pose peut être des questions idiotes mais visiblement, il y a des choses que je n'ai pas comprises.

  4. #4
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Tu te trompe.

    Que ce soit le solution 1 ou la solution 2 la même fenêtre s'ouvrira. Ce sera la fenetre de téléchargement du navigateur qui s'ouvrira.

    --
    Partons sur la solution 1.

    En fait tu ne dois pas faire d'appel Rpc. Il n'y aura pas de callback à implémenter non plus.

    Tu dois écrire une simple Servlet standard qui va renvoyer en réponse le flux du document, avec le bout de code de ton premier post. Côté GWT tu dois seulement effectuer un appel Http get à l'aide d'un lien hypertexte ou avec un bouton de formulaire.

    Ta servlet va donc recevoir une requete GET, elle va renvoyer à ton navigateur une réponse dans lequel se trouvera en corp le document et en en-tête de la réponse se trouvera le content-type et le Content-Length adéquate.

    Le navigateur en recevant cette réponse va ouvrir une fenetre de téléchargement avec laquel tu pourras enregistrer ou ouvrir le document.

    Astuce au cas où tu ne maitrises pas les Servlet. Tu dois déclarer ta Servlet dans ton fichier web.xml. Je te conseille de terminer les appels rpc par *rpc afin de pouvoir séparer les appels Rpc des Autres appels (Servlet, fichier..)
    --
    Solution 2

    je t'encourage à commencer par essayer la solution 2. Tu verras que tu te prendra moins la tête car tu n'aura pas à gérer les entêtes de réponse de tes flux Http. C'est ton serveur web en frontal qui s'en occupera.

    Commence par copier / coller un doc dans le dossier public. Et fait un lien hypertexte sur ta page avec l'url qu'il faut pour le télécharger. Tu verras que c'est très rapide à faire et je pense que ca répondra mieux à ton besoin.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ok. Partons pour la solution 2.
    Le soucis, c'est que je n'ai pas de dossier "public" puisque j'utilise Maven2 dans mon projet. Je crois que ce sont les images qui vont dans le dossier "public" et moi, mes images se trouvent dans : src/main/webapp/images/
    Dois créer lle répertoire public à l'emplacement suivant : src/main/webapp/public/
    Je mets donc ensuite un fichier .csv dedans.
    Et ensuite, comment je fais pour trouver l'URL qu'il faut pour télécharger le fichier ? Ca doit être dans le web.xml, non ?
    Merci pour ta participation à mon problème et désolé de ne pas être plus compétent que ça.

  6. #6
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Pas de problème, c'est en affrontant ces problèmes que tu connaitras les réponses par la suite. Nous sommes tous passé par là

    Maven2 te donne une structure de projet qui te permet de te retrouver facilement en passant d'un projet M2 à un autre. Normal c'est toujours la même chose (lorsque le standard est suivi car on peut toujours configurer pour personnaliser, ce qui n'est pas une bonne chose dans l'absolu)

    Tes fichiers sources seront donc organisé d'une certaine manière. Lorsque tu va packager ton application, c'est à dire, lorsque tu va construire ton war avec la commande "mvn package", maven va copier les fichiers qui se trouvent dans src et va les coller dans le repertoire target dans le bon emplacement.

    Tout ce qui se trouve dans le repertoire "src/main/webapp" sera copié dans le war.

    Donc ton repertoire image est un repertoire src/main/webapp/images qui sera accessible par Http et par tout le monde.

    Tu peux essayer en lancant ton application avec gwt:run. Une fois ton application lancé avec une url du type http://localhost:8080/mon.package/monApplication.html

    Essais d'ouvrir une image en tapant se genre d'URL dans ton navigateur http://localhost:8080/mon.package/im...oireImages.png

    Tu verras que tes images sont bien accessible à tout le monde par une simple requete Http GET.

    Maintenant si tu places ton fichier csv dans ce reprtoire, tu y aura accès de la même manière.

    Tu peux créer un repertoire "files" à côté du repertoire "images" afin d'organiser un peu mieux tes images mais le principes reste le même: Tous les reprtoire qui se trouve dans ton war, a part le WEB-INF sont accessible en public.

    J'espere que ca t'aidera,
    +

    PS: vas y pas à pas, commence par mettre ton fichier csv dans images avant de créer tout de suite un nouveau repertoire. Si tu as un soucis revient en parler.

    PS2: normalement tu devrais avoir un repertoire public avec maven2 qui se trouve là: src/main/resources/public

    PS3: petit lien sur le sujet
    http://blog.octo.com/environnement-d...e-pour-gwt-17/

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ok. Super. Je viens de voir ça, j'ai en effet accès à mes images en tapant dans mon navigateur cette URL par exemple :
    http://localhost:8080/MonProjet/images/logo.gif
    J'ai ensuite mis mon fichier .csv dans le répertoire images/ et j'y accède également, sauf que lorsque j'essaie de le télécharger par le navigateur, il me l'affiche dans le navigateur au lieu de la télécharger. Surement, car c'est un format lisible par le navigateur.
    Comment faire pour télécharger le fichier avec la fenêtre où on propose d'ouvrir ou enregistrer le fichier ?

  8. #8
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    C'est à l'utilisateur de choisir la manière dont il souhaite consommer la ressource.

    Lorsque tu proposeras un lien dans ta page pour télécharger ce document, l'utilisateur pourra faire un click droit dessus pour faire enregistrer sous.

    Si tu souhaite tout de même forcer le téléchargement en interdisant la visualisation dans le navigateur, tu dois spécifier les headers suivant :

    (code PHP mais le principe reste le même)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    header("Content-Type: application/force-download");
    header("Content-Transfer-Encoding: text/csv\n"); // Surtout ne pas enlever le \n
    Solution 1 :
    - Tu as facilement accès aux header avec l'exemple de ton premier poste.

    Solution 2 :
    - Tu dois configurer ton serveur Http frontal pour lui dire d'ajouter les deux headers ci-dessus lorsqu'on télécharge un fichier qui mappe avec *csv

    ----------------
    Mais je te conseille de laisser le choix à l'utilisateur. C'est toujours mieux d'avoir le choix.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Finalement, j'ai réussi la première méthode. J'ai implémenté une servlet spécifique à l'export CSV qui tape dans la base de données, crée le flux et force le téléchargement avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reponse.setContentType("application/force-download");
    Et ça marche nickel.
    Par contre, je n'ai pas compris l'utilité du bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header("Content-Transfer-Encoding: text/csv\n");
    Pourrais-tu m'expliquer pvoncken please ?

    Dans tous les cas, je te remercie pour ton aide précieuse. J'ai finalement privilégié la première solution car la deuxième amène à gérer des noms de fichiers et de la purge de fichiers...

  10. #10
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Tu as raison, la première solution te donne plus de souplesse. En plus tu peux protéger tes fichiers ce qui peut être intéressant aussi.

    le Content-Transfer-Encoding permet d'indiquer à l'agent consommateur quel type de fichier est transféré. Ca peut être utile lors de mise en place de routage automatisé par exemple.

    L'agent consommateur n'étant pas forcément un simple navigateur.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ok. Merci !

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour, je me suis mis tout récement a GWT, et je dois proposer le téléchargement de fichiers (.avi, .txt etc...) au client. J'ai pour l'instant créer une méthode pour lister mes dossiers, et aprés avoir sélectionné le fichier, je veux que la pop up habituelle de téléchargement s'ouvre lorsqu'il appuie sur le bouton télécharger.
    Je voudrais implémenter la solution 1 et je vois que vous avez répondu a ceci, seulement j'ai du mal a comprendre ou je dois ecrire telle ou telle chose au niveau de la servlet (j'ai compris le coup de la déclaration dans le xml).
    Dois-je créer une nouvelle classe dans mon package serveur et deux nouveax interfaces dans le client ?
    J'ai actuellement deja une servlet qui fonctionne avec le code suivant coté serveur
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    package com.google.gwt.sample.VirtualAgentDatabase.server;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import com.google.gwt.sample.VirtualAgentDatabase.client.GreetingService;
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
     
    @SuppressWarnings("serial")
    public class GreetingServiceImpl extends RemoteServiceServlet implements
    		GreetingService {
    	// List everything in the specified directory
     
     
    	public String[] listing(String Directory, int Type){
     
    		File Resultatprep[];
    		String Resultat[] = new String[300];
    		File DirectoryToScan = new File(Directory);
     
    		if (DirectoryToScan.isDirectory()){
    			if (Type == 0){
    				Resultat = DirectoryToScan.list();
    			} else {
    				Resultatprep = DirectoryToScan.listFiles();
    				int j = 0;
    				for (int i=0;i<Resultatprep.length;i++){
    					if (Resultatprep[i].isDirectory()){
    						String ResultatTemp = Resultatprep[i].getName();
    						Resultat[j] = ResultatTemp;
    						j++;
    					}
     
    				}
     
     
    			}
     
    		}
     
    		return Resultat;
    		}
     
    	public ArrayList<String> searchExt(String Directory, ArrayList<String> ResultInt, String Extension) {	
     
    		File DirectoryToScan = new File (Directory);
    		//ArrayList<String> Resultat = new ArrayList<String>();
     
    		if (DirectoryToScan.isDirectory()) {
     
    			    File[] list = DirectoryToScan.listFiles();
     
    			    if (list != null) {
    				for (int i = 0; i < list.length; i++) {
    				    searchExt(list[i].getAbsolutePath(), ResultInt, Extension);
    				}
    			    } 
    			} else { 
    			    if (DirectoryToScan.getName().endsWith(Extension)){
    			    	ResultInt.add(DirectoryToScan.getName());	
    			    }
     
    			}
     
     
     
    	return ResultInt;
    	}

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Salut,
    Je peux te donner quelques pistes concernant ce topic puisque j'en suis l'auteur. En fait, pour que tout fonctionne :

    1) Côté client :
    Tu construis ton URL pour faire ta requête HTTP GET (avec les paramètres que tu veux) et tu fais une redirection en javascript natif avec cette URL.
    Voici le bout de code pour la redirection javascript natif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static native void faireRedirection(String url) /*-{
    $wnd.location = url;
    }-*/;
    2) Côté serveur :
    La redirection appelle ta servlet (attention à configurer ton web.xml) et là tu construit le fichier que tu veux renvoyer et tu envoies tout ça dans un PrintWriter en forçant le téléchargement côté client.
    Voici le bout de code pour renvoyer ton fichier et forcer le téléchargement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Une fois le fichier construit, on l'envoie et on force le téléchargement côté client
    OutputStream stream = reponse.getOutputStream();
    reponse.setContentType("application/force-download"); // Ne pas oublier ça
    PrintWriter flux = new PrintWriter(stream);
    flux.append(tonFichier); // un String par exemple pour du .txt
    flux.flush();
    flux.close();

  14. #14
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ta reponse,
    je vais essayer de me debrouiller !

  15. #15
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Pour le coté serveur, c'est bon. Cependant, j'ai du mal a voir comment faire l'appel de ma servlet du coté client.
    J'ai mon bouton "Download", je veux qu'en cliquant dessus, le client envoie le nom du fichier et son pathname en parametres pour que le serveur lance le telechargement du bon fichier.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ce n'est pas compliqué. Tu fais une requête HTTP GET, ça signifie juste appeler une nouvelle URL pour toi.
    L'URL que tu passes dans ta redirection devrait donc avoir une tête comme ceci (si tu es sous Tomcat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost:8080/TonProjet/Export?nomFichier=monFichier&pathName=monPathName
    Donc quand tu cliques sur "Download", tu appelles la méthode faireRedirection(String url) en passant l'URL ci-dessus. C'est tout ce que tu as à faire côté client.

  17. #17
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, maintenant tout marche a merveille !

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    You're welcome

  19. #19
    Membre régulier
    Profil pro
    Architecte
    Inscrit en
    Mai 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2004
    Messages : 57
    Points : 80
    Points
    80
    Par défaut
    Bonjour,
    Je remet le post au gout du jour en ajoutant une question supplémentaire :

    Peux faire plusieurs téléchargements en simultané ?
    Mon idée est de demander à l'utilisateur un répertoire cible sur son PC et de télécharger plusieurs fichiers sans qu'il ai la fenêtre de téléchargement qui s'ouvre pour chaqu'un.
    Est ce possible avec GWT ?

    ps : Ça ressemble fortement à un client FTP se que je veux faire

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Bonjour,

    Le bout de code ci-dessus est vraiment destiné à générer un fichier dynamiquement à partir de données en base par exemple.
    Ce que tu demandes me parait difficile mais c'est peut être faisable. N'oublie pas que GWT fait de l'asynchrone et un client FTP, ce n'est pas de l'asynchrone.

    Peut être que pvoncken aurait une idée ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2011, 17h43
  2. [CSV] Proposer le téléchargement d'un fichier
    Par virgrennes dans le forum Langage
    Réponses: 21
    Dernier message: 04/01/2008, 10h56
  3. Proposer le téléchargement d'un fichier
    Par black is beautiful dans le forum ASP
    Réponses: 8
    Dernier message: 10/09/2007, 14h59
  4. Obliger un fichier (quelqu'en soit l'extension) à se proposer en téléchargement
    Par Larsen00 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/06/2007, 13h19
  5. Réponses: 4
    Dernier message: 09/04/2006, 01h19

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