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 :

Rest SDK récupérer un fichier dans le body et le stocker dans un dossier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Par défaut Rest SDK récupérer un fichier dans le body et le stocker dans un dossier
    Bonjour à tous,

    Voilà, j'expose le contexte avec ce que j'ai fait, et ce que j'ai pu faire, et le problème sur lequel je bloque depuis quelque temps.

    Je suis en train de développer un serveur, un webservice en C++ avec la librairie de microsoft C++ Rest SDK.
    J'ai pu setup mon serveur pour prendre en compte les requêtes HTTP en POST comme ceci:

    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
     
    int main(int argc, const char** argv)
    {
         http_listener listenerUpload(L"http://localhost/upload");
     
        try
        {
              listenerUpload
    			.open()
    			.then([&listenerUpload]() {std::TRACE(L"\nServer started\n"); })
    			.wait();
     
              while (true);
        }
        catch (std::exception const & e)
        {
    	std::cout << e.what() << std::endl;
        }
    }
    Je récupère ma requête via ma méthode:

    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
     
     
    void handle_uploadPostFile(http_request request)
    {
       is_authorized(request); //Cette methode sert à vérififier le token, sa validité, sa date d'expiration et les roles de l'utilisateur
     
       auto file = request.body(); //Je veux  récupérer le fichier envoyé ici
     
       boost::filesystem::path path(boost::filesystem::current_path()); //Je crée l'adresse de mon répertoire ou je veux stocker mes fichiers reçu 
       std::string storageFolder{ "\\media" };
       std::string repository{ path.string() + storageFolder };
     
       std::ofstream filePath(repository);
       filePath << file;
     
       request.reply(200, file);   
     
    }
    Le retour de ma requête "request.reply(200, file);" me retourne ça quand je lui passe par exemple une image:

    Nom : postman file request.png
Affichages : 684
Taille : 89,2 Ko

    Je voudrais stocker ce fichier dans un dossier, je vous ai épargné tout les morceaux de code en commentaire après mes maintes tests.
    En espérant que l'on puisse m'aider à résoudre enfin ce problème sur lequel je bute depuis un moment.
    Merci d'avoir pris le temps de me lire et m'aider à me sortir de ce problème.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    C'est quoi le problème ?
    Tu reçois le fichier, crées le path, ensuite il faut juste ouvrir un fichier en écriture et y copier les données reçues.
    Quand au retour, je ne comprends pas pourquoi tu renvoies les données de l'image.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Par défaut
    Ah oui, j'ai oublié de préciser, je renvoie les données de l'image pour tester que tout fonctionne, je m'en sers comme debug pour le moment.

    Tu reçois le fichier: ça c'est OK;
    crées le path: ça c'est OK;

    ensuite il faut juste ouvrir un fichier en écriture et y copier les données reçues: C'est là que je me suis un peu perdu ,je ne suis pas non plus expert en C++, j'avais la même méthode en tête mais je ne vois pas trop comment faire, l'objet "file" est de type concurrency::streams::istream j'ai donc des problèmes de convertion quand je veux crée un fichier avec les données du fichier reçu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    std::ofstream filePath(repository); //J'ai oublié de le rajouter dans le premier commentaire je le rajoute ici
     
    filePath << file; //là j'ai essayé d'insérer mon fichier dans mon dossier, mais en vérité c'est juste les données de mon fichier reçu
    Je vois pas trop comment je pourrais m'y prendre, à vrai dire c'est peut être à force de tourner en rond..

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Par défaut
    Ce que je ne comprend pas, c'est pourquoi il me retourne 1 comme valeur si je fais: std::cout << file << std::endl;

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    std::ofstream filePath(repository); va ouvrir un stream vers.. un dossier ? Ça me parait difficilement possible. Faut faire preuve d'un peu de logique
    Un stream doit s'ouvrir vers un fichier.
    Au hasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const std::string filepath(repository + "\\toto.png");
    std::ofstream file(filepath, std::ios_base::openmode::binary);
    if(file.is_open())
      file << filedata;
    else
      // error
    Ce que je ne comprend pas, c'est pourquoi il me retourne 1 comme valeur si je fais: std::cout << file << std::endl;
    file est de la donnée brute, cout est fait pour afficher du texte.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Par défaut
    Merci pour ton retour Bousk.

    Pour "std::ofstream file(filepath, std::ios_base::binary);" apparemment std::ios_base::binary suffit.

    Par contre :
    Ne fonctionne pas, le rendu du fichier donne ça:

    Nom : retour toto ex ws.png
Affichages : 590
Taille : 34,4 Ko

    Une idée ?
    Pour moi, le problème viendrait qu'il prend le nom du fichier et le content-type au lieu de passer seulement le contenu du fichier ?

    Comme ça:

    Nom : 23.png
Affichages : 680
Taille : 52,7 Ko

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    request.body(); te retourne le contenu de la requête HTTP.
    Bien sûr une requête HTTP contient plein de conneries, des en-têtes etc.
    Toi ce qu'il te faut c'est bien entendu juste le contenu du fichier. Qu'il te faut extraire du body si tu n'as que ça.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/11/2011, 09h04
  2. [Batch] Récupérer le nom d'un fichier dans un dossier
    Par mmahouac dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 13/08/2009, 16h47
  3. récupérer contenu fichier dans une variable
    Par kalyparker dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/07/2007, 18h10
  4. récupérer un fichier dans une string
    Par barhili04 dans le forum C#
    Réponses: 3
    Dernier message: 17/05/2007, 17h49
  5. Récupérer path fichier dans appli Web
    Par Mister Nono dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 16/05/2007, 10h31

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