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

C# Discussion :

HttpWebRequest et POST


Sujet :

C#

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut HttpWebRequest et POST
    Bonjour,

    Depuis 3 jours, je tente désespérément d'envoyer une requête POST à un script php avec HttpWebRequest mais rien ne marche.

    Je dois envoyer 2 paramètres (genre login=toto&password=machin ) et un fichier comme si je passais par un input file en html.

    Tous les exemples que j'ai pu trouver ne donne rien. Ma requête arrive bien sur le serveur mais les éléments transmis n'arrivent pas.

    La situation devient critique ...

    Quelqu'un aurait déjà eu ce problème et aurait un bout de code qui fonctionne ?

    Papy !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Avec ça, ça devrait le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    byte[] bytes = Encoding.ASCII.GetBytes("login=toto&password=machin");
    request.ContentLength = bytes.Length;
    using (var reqStream = request.GetRequestStream())
    {
        reqStream.Write(bytes, 0, bytes.Length);
    }
    var response = (HttpWebResponse)request.GetResponse();
    Sinon tu peux toujours utiliser WebClient.UploadValues, c'est plus simple... par contre ça gère pas nativement les cookies (mais c'est assez facile à ajouter)

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai déjà essayé ce genre ce chose, ça fonctionne. Mais avec ce code, je ne peux pas joindre de fichier.

    Mais d'après tous les exemples que j'ai pu trouver, pour envoyer un fichier en même temps, il ne faut pas utiliser "application/x-www-form-urlencoded" mais "multipart/form-data". Et dans ce cas, plus rien ne marche. Il faut composer le corps de la requête avec des parties séparées par des délimiteurs.

    Et là, c'est le drame ! :-(

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Le WebClient envoie bien mon fichier.

    Si je n'ai pas d'autre solution, j'utiliserai ça en faisant un zip d'un fichier de paramètres avec le fichier à joindre. Ça résoudra le problème.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai déjà essayé ce genre ce chose, ça fonctionne. Mais avec ce code, je ne peux pas joindre de fichier.

    Mais d'après tous les exemples que j'ai pu trouver, pour envoyer un fichier en même temps, il ne faut pas utiliser "application/x-www-form-urlencoded" mais "multipart/form-data". Et dans ce cas, plus rien ne marche. Il faut composer le corps de la requête avec des parties séparées par des délimiteurs.

    Et là, c'est le drame ! :-(
    Ah oui, là c'est plus galère... ce que je te suggère, c'est d'utiliser Fiddler pour examiner la requête envoyée par un navigateur pour ce type de formulaire, et d'essayer de générer la même avec HttpWebRequest

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai déjà regardé avec firebug, mais mais j'ai beau comparer le contenu et un test identique fait à partir d'un formulaire html de test, je ne comprends pas ce qui lui manque.

    Je vais rester sur le WebCLient avec un fichier unique zip qui inclura les paramètres. Merci pour cette m'avoir indiqué cette piste la.

    Je laisse le topic ouvert quelques jours encore au cas où quelqu'un aurait la solution avec HttpWebRequest.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Si j'ai bien compris ce que tu cherches à faire, c'est envoyer un fichier + des variables via la meme requete HTTP ?
    Si c'est bien ca, j'ai bidouillé qqch qui fonctionne si ca t'interesse.
    Moi j'ai fais ca au click sur un bouton. Je me suis basé sur un script que tu avais filé dans un autre de tes posts si je ne me trompe pas.
    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
            private void button1_Click(object sender, EventArgs e)
            {
     
                string url = "http://tonsite.com/tapagederecupdupload.php";
                string [] files = {@"C:\fichier1.txt",@"C:\fichier2.jpg"};
                string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
     
                HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
                httpWebRequest2.Method = "POST";
                httpWebRequest2.KeepAlive = true;
                httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;
     
                Stream memStream = new System.IO.MemoryStream();
     
                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                string headerTemplate = "Content-Disposition: attachment; name=\"{0}\"; filename=\"{1}\";\r\n Content-Type: application/octet-stream\r\n\r\n";
                for (int i = 0; i < files.Length; i++)
                {
                    string header = string.Format(headerTemplate, "fichier_photo[]", files[i]);
                    string entete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\n--" + boundary +"\r\n"+ header;
                    entete = string.Format(entete, "tavariable", "ta valeur");
                    byte[] headerbytes = System.Text.Encoding.ASCII.GetBytes(entete);
                    memStream.Write(headerbytes, 0, headerbytes.Length);
     
                    FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read);
                    byte[] buffer = new byte[1024];
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        memStream.Write(buffer, 0, bytesRead);
                    }
                    memStream.Write(boundarybytes, 0, boundarybytes.Length);
                    fileStream.Close();
                }
     
                httpWebRequest2.ContentLength = memStream.Length;
                Stream requestStream = httpWebRequest2.GetRequestStream();
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
                requestStream.Close();
                WebResponse webResponse2 = httpWebRequest2.GetResponse();
                Stream stream2 = webResponse2.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                MessageBox.Show("Resultat = " + reader2.ReadToEnd()); //J'affiche la réponse dans une MessageBox pour vérifier que les fichiers sont bien postés.
     
                webResponse2.Close();
                httpWebRequest2 = null;
                webResponse2 = null;
            }
    La ligne qui t'interesse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string entete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\n--" + boundary +"\r\n"+ header;
                    entete = string.Format(entete, "tavariable", "ta valeur");
    Voilà, en esperant que c'était bien ta question

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Ah si ça fonctionne, c'est génial ! Je vais tester ça dès ce soir.
    Il faudra juste que je trouve où était mon erreur.

    Tu devrais proposer ça pour la FAQ C# ici. Parce que je ne suis pas le seul à avoir eu ce problème.

    Merci déjà d'avoir ecrit ça !

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Je confirme, ça fonctionne.

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    La méthode donnée ici en solution permet d'envoyer de 1 à n fichiers avec un couple variable=valeur pour chaque fichier. Je poste ici le code qui permet d'envoyer en ensemble de variables et de 1 à n fichiers. Ca pourra peut-être servir à quelqu'un.

    Précision, je n'ai fais qu'améliorer le code corrigé par xYz-Falcon que je remercie à nouveau.

    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
     
    public static string Post(Uri url, string[] files, NameValueCollection parameters)
    {
     
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
     
        string entete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\n--" + boundary + "\r\n";
     
        HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
        httpWebRequest2.Method = "POST";
        httpWebRequest2.KeepAlive = true;
        httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;
     
        Stream memStream = new System.IO.MemoryStream();
     
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
        memStream.Write(boundarybytes, 0, boundarybytes.Length);
     
        string fileTemplate = "Content-Disposition: attachment; name=\"files[]\"; filename=\"{0}\";\r\n Content-Type: application/octet-stream\r\n\r\n";
        byte[] fileBytes;
     
        for (int i = 0; i < files.Length; i++)
        {
     
            if (i == 0)
            {
                foreach (string item in parameters)
                {
                    byte[] headerbytes = System.Text.Encoding.ASCII.GetBytes(string.Format(entete, item, parameters[item]));
                    memStream.Write(headerbytes, 0, headerbytes.Length);
                }
            }
     
            fileBytes = System.Text.Encoding.ASCII.GetBytes(string.Format(fileTemplate, files[i]));
            memStream.Write(fileBytes, 0, fileBytes.Length);                
            FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                memStream.Write(buffer, 0, bytesRead);
            }
            memStream.Write(boundarybytes, 0, boundarybytes.Length);
            fileStream.Close();
        }
     
        httpWebRequest2.ContentLength = memStream.Length;
        Stream requestStream = httpWebRequest2.GetRequestStream();
        memStream.Position = 0;
        byte[] tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();
        requestStream.Write(tempBuffer, 0, tempBuffer.Length);
        requestStream.Close();
        WebResponse webResponse2 = httpWebRequest2.GetResponse();
        Stream stream2 = webResponse2.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);
        var result = reader2.ReadToEnd();
     
        webResponse2.Close();
        httpWebRequest2 = null;
        webResponse2 = null;
     
        return result;
    }

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 70
    Points : 61
    Points
    61
    Par défaut
    Bonjour,
    J'ai un petit problème en réutilisant le code de Papy214 , j'ai ces données a envoyer avec mon document:
    USER_LOGIN
    USER_PASSWD
    FILE_NAME
    FILE_HASH
    FILE_HASH_TYPE
    DOCATTACH: L’objet à verser.
    RTNTYPE: Le format de réponse souhaité TXT ou XML

    Le problème est que je ne vois pas quoi mettre dans cette variable sachant que je charge le document après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NameValueCollection myNameValueCollection = new NameValueCollection();
                //put   
    string uploadfile = "d:\\test\\test.txt";
               myNameValueCollection.Add("USER_LOGIN","");
               myNameValueCollection.Add("USER_PASSWD","");
               myNameValueCollection.Add("FILE_NAME", "test");
               myNameValueCollection.Add("FILE_HASH", hex);
               myNameValueCollection.Add("FILE_HASH_TYPE","SHA256");
               myNameValueCollection.Add("DOCATTACH", uploadfile);
               myNameValueCollection.Add("RTNTYPE","XML"); 
     
    string rep= Post(uri, files, myNameValueCollection);
    Pour passer le document a verser avec la variable DOCATTACH il faut que je modifie string fileTemplate ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string fileTemplate = "Content-Disposition: attachment; name=\"files[]\"; filename=\"{0}\";\r\n Content-Type: application/octet-stream\r\n\r\n";
    Merci de votre aide.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Avril 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2011
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par mlio91 Voir le message
    Bonjour,
    J'ai un petit problème en réutilisant le code de Papy214 , j'ai ces données a envoyer avec mon document:
    USER_LOGIN
    USER_PASSWD
    FILE_NAME
    FILE_HASH
    FILE_HASH_TYPE
    DOCATTACH: L’objet à verser.
    RTNTYPE: Le format de réponse souhaité TXT ou XML

    Le problème est que je ne vois pas quoi mettre dans cette variable sachant que je charge le document après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NameValueCollection myNameValueCollection = new NameValueCollection();
                //put   
    string uploadfile = "d:\\test\\test.txt";
               myNameValueCollection.Add("USER_LOGIN","");
               myNameValueCollection.Add("USER_PASSWD","");
               myNameValueCollection.Add("FILE_NAME", "test");
               myNameValueCollection.Add("FILE_HASH", hex);
               myNameValueCollection.Add("FILE_HASH_TYPE","SHA256");
               myNameValueCollection.Add("DOCATTACH", uploadfile);
               myNameValueCollection.Add("RTNTYPE","XML"); 
     
    string rep= Post(uri, files, myNameValueCollection);
    Pour passer le document a verser avec la variable DOCATTACH il faut que je modifie string fileTemplate ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string fileTemplate = "Content-Disposition: attachment; name=\"files[]\"; filename=\"{0}\";\r\n Content-Type: application/octet-stream\r\n\r\n";
    Merci de votre aide.
    Hé ben, tu réveilles un post vieux de 4 ans là ^^'
    Peux tu nous montrer ton code au complet, difficile de t'aider avec seulement un bout de code.

    As-tu un seul fichier a envoyer ? Ou tu prévois ton code pour n fichiers a envoyer ?

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 70
    Points : 61
    Points
    61
    Par défaut
    C'est bon j'ai trouvé la solution. Jutilise le code suivant et je passe mon paramètre DOCATTACH :

    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
    public static string HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc)
            {
                string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    
                HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
                wr.ContentType = "multipart/form-data; boundary=" + boundary;
                wr.Method = "POST";
                wr.KeepAlive = true;
                wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
                Stream rs = wr.GetRequestStream();
                string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                foreach (string key in nvc.Keys)
                {
                    rs.Write(boundarybytes, 0, boundarybytes.Length);
                    string formitem = string.Format(formdataTemplate, key, nvc[key]);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                    rs.Write(formitembytes, 0, formitembytes.Length);
                }
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
                string header = string.Format(headerTemplate, paramName, file, contentType);
                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                rs.Write(headerbytes, 0, headerbytes.Length);
                FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
                byte[] buffer = new byte[4096];
                int bytesRead = 0;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    rs.Write(buffer, 0, bytesRead);
                }
                fileStream.Close();
                byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                rs.Write(trailer, 0, trailer.Length);
                rs.Close();
                WebResponse wresp = null;
                    wresp = wr.GetResponse();
                    Stream stream2 = wresp.GetResponseStream();
                    StreamReader reader2 = new StreamReader(stream2);
                   var result = reader2.ReadToEnd();
          
                        wresp.Close();
                        wresp = null;
    
                        return result;
                        
            }

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

Discussions similaires

  1. POST via HttpWebREquest
    Par vincentbo dans le forum C#
    Réponses: 2
    Dernier message: 13/01/2010, 15h33
  2. Réponses: 0
    Dernier message: 26/02/2009, 19h36
  3. Réponses: 1
    Dernier message: 17/12/2008, 15h15
  4. Réponses: 5
    Dernier message: 17/09/2008, 15h56
  5. Réponses: 1
    Dernier message: 30/07/2007, 18h31

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