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 :

[C++] Uploader un fichier


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [C++] Uploader un fichier
    Bonjour,

    Je suis actuellement en train de coder un petit programme en C++ qui doit envoyer un fichier texte sur mon serveur FTP par le biais d'une page PHP.
    Voilà son code (réduit au stricte minimum sans gestions d'erreurs) :

    Code php : 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
    <body>
    <FORM METHOD="POST" ENCTYPE="multipart/form-data">
    <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="100000"> Fichier à envoyer : <INPUT TYPE="file" NAME="fichier">
    <INPUT TYPE="submit" NAME="OK" VALUE="Envoyer">
    </FORM>
     
    <?php
    if (isset($_POST["OK"]))
    {
        $nom = $_FILES["fichier"]["name"];
        $temporaire = $_FILES["fichier"]["tmp_name"];
        $destination = "$nom";
        copy($temporaire,$destination);
    }
    ?>
     
    </body>

    Mais je ne sais pas comment faire pour envoyer à la page php le fichier à uploader en utilisant la méthode POST.

    j'ai entendu parler des sockets et d'une librairie libcurl mais je ne connais pas du tout cela.

    Si vous pourriez m'indiquer la méthode à utiliser et comment l'utiliser je serait ravi ! Merci

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Tu peux utiliser le module network de sfml pour des trucs simples au niveau réseau.

    http://www.sfml-dev.org/index-fr.php
    http://www.sfml-dev.org/tutorials/1....rk-http-fr.php

    C'est vraiment simple à utiliser.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup je testerais ça demain

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    J'ai installé SFML qui à l'aire vraiment bien, j'ai suivi le tuto d'ici :
    http://www.sfml-dev.org/tutorials/1....rk-http-fr.php
    Le problème c'est que leur exemple c'est avec la méthode GET
    Le fonctionnement de la méthode POST n'a pas l'aire beaucoup différente mais j'ai un souci car pour la ligne Request.SetBody(""); il dise :
    Un corps, qui est le contenu à envoyer si la méthode est Post; ce membre est ignoré si la méthode est Get ou Head
    J'ignore ce qu'il faut mettre dans dans le SetBody();
    Pour le moment mon code ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
        sf::Http::Request Request;
        Request.SetMethod(sf::Http::Request::Post);
        Request.SetURI("http://world.power-heberg.com/upload/upload.php");
        Request.SetBody("");
        Request.SetHttpVersion(1, 0);
        //Request.SetField("From", "my_email@gmail.com");
     
        return 0;
    }

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Ne t'inquiète pas, tu utilises bien la méthode POST:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Request.SetMethod(sf::Http::Request::Post);
    Ensuite le problème c'est de savoir comment sont envoyées les données par POST.

    Je verrais bien quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string request = "variable=\"contenu\"\r\nvariable2=\"contenu2\"";
    Request.SetBody(request);
    Request.SetField("Content-Length", request.length());
    Essaie d'abord avec des exemples simples, pour voir si ça marche.
    Ensuite peut-être qu'il faudra échapper tous les " du fichier pour que le fichier soit bien considéré comme une seule et même variable.

    Enfin l'essentiel c'est de faire des tests!


    Edit:

    j'ai vu que les différents champs étaient séparés par des '&':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string request = "variable=contenu&variable2=contenu2";
    Request.SetBody(request);
    Request.SetField("Content-Length", request.length());
    Mais si contenu contient des caractères & il faudra trouver une solution (guillemets, échappements, caractères spéciaux, ...)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je fait des tests simples ça fonction presque.

    j'ai une page php comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    	if ( $_POST["nom"] == "test" )
    		fopen("OK.txt", "a");
    	else
    		fopen("ERREUR.txt", "a");
    ?>
    Pour la tester avec mon navigateur web j'ai une page html comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <html>
    <head>
    </head>
    	<form action="action.php" method="POST">
    		<input type="text" name="nom"/>
    		<input type="submit" name="OK" value="Connexion"/>
    	</form>
    </body>
    </html>
    Ça marche parfaitement avec mon navigateur !!

    Donc pour tester avec mon projet en C++ j'ai mis ça :

    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
     
        sf::Http Http;
        Http.SetHost("www.world.power-heberg.com");
     
        string envoye = "nom=test";
        sf::Http::Request Request;
        Request.SetMethod(sf::Http::Request::Post);
        Request.SetURI("/upload/action.php");
        Request.SetBody(envoye);
        Request.SetHttpVersion(1, 0);
        //Request.SetField("nom=test", "nom=test");
     
        sf::Http::Response Page = Http.SendRequest(Request);
     
        std::cout << "Reponse de mon serveur" << std::endl
                  << "Status code (should be 200 on success): " << Page.GetStatus() << std::endl
                  << "HTTP version: " << Page.GetMajorHttpVersion() << "." << Page.GetMinorHttpVersion() << std::endl;
     
        return EXIT_SUCCESS;
    Malheureusement ça créer le fichier ERREUR.txt alors que la variable envoye est bien "nom=test" ce qui devrait créer un fichier OK.txt.

    Ps : Merci pour ton aide

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    C'est bon j'ai réussi :
    Il fallait mettre la ligne :
    Request.SetField("Content-Type", "application/x-www-form-urlencoded");
    (Merci Wireshark)

    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
     
        sf::Http Http;
        Http.SetHost("www.world.power-heberg.com");
     
        string envoye = "nom=test";
        sf::Http::Request Request;
        Request.SetMethod(sf::Http::Request::Post);
        Request.SetURI("/upload/action.php");
        Request.SetBody("nom=test");
        Request.SetHttpVersion(1, 0);
        Request.SetField("Content-Type", "application/x-www-form-urlencoded");
     
        sf::Http::Response Page = Http.SendRequest(Request);
     
        std::cout << "Reponse de mon serveur" << std::endl
                  << "Status code (should be 200 on success): " << Page.GetStatus() << std::endl
                  << "HTTP version: " << Page.GetMajorHttpVersion() << "." << Page.GetMinorHttpVersion() << std::endl;
     
        return EXIT_SUCCESS;
    Merci encore pour ton aide

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    C'est bizarre, ce bug avait été signalé et le champ était censé être mis par défaut.

    Je suppose que ce n'est vrai que pour la version en développement.

    En tout cas content que tu aies réussi.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En effet, ce bug a été corrigé après la sortie de la dernière version.

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

Discussions similaires

  1. [FTP] Problème pour uploader un fichier
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/01/2008, 22h21
  2. Upload de fichier par XMLHTTP
    Par Immobilis dans le forum ASP
    Réponses: 6
    Dernier message: 21/01/2005, 17h02
  3. upload de fichier
    Par 120 dans le forum ASP
    Réponses: 16
    Dernier message: 21/06/2004, 12h07
  4. Upload de fichiers sur un ftp
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 20/06/2004, 11h55
  5. Upload de fichiers
    Par GDVL dans le forum ASP
    Réponses: 4
    Dernier message: 03/06/2004, 12h44

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