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++

  1. #21
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Du coup, il faudrait couper le fichier :
    • ouvrir le fichier en texte ;
    • lire les lignes d'entête ;
    • trouver où on en est dans la lecture du fichier (position du curseur de lecteur) ;
    • fermer le fichier ;
    • le réouvrir en binaire ;
    • se placer là où on s'est arrêté (donc après le texte) ;
    • faire ce qu'il faut faire sur le binaire.

    Cela me parait lourd et "pas propre", mais là, je ne vois pas mieux.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #22
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Il ne devrait jamais y avoir de fichier texte dans l'équation. Surtout si c'est pour l'ouvrir avec notepad... Au moins Notepad++ reconnait et affiche tous les caractères (mais ils n'en sont sûrement pas plus copiables).
    extract_vector extrait les données reçues, puis tu extraies ce qu'il faut depuis les données reçues.
    Et tu enregistres ces données directement en binaire correctement.
    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. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour commencer, pourquoi un fichier?
    Normalement le résultat de la requête, ne l'a-t-on pas en RAM?

    Ensuite, ouvrir en mode texte est une mauvaise idée parce que le retour d'une requête HTTP contient systématiquement des CR+LF, aussi bien sous Windows que sous Linux. La bonne nouvelle, c'est que les en-têtes sont en ASCII étendu (et encore, seules les valeurs des en-têtes (et la première ligne d'une requête) peuvent contenir des caractères non-ASCII).

    Ce qu'il faut garder à l'esprit, c'est que dans des données multipart/form-data, on cherche un champ parmi potentiellement plusieurs. D'où la nécessité du délimiteur. En théorie la première chose à faire est de séparer selon ces délimiteurs. En gros, un truc comme ça:
    Code C++ : 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
    struct response_range
    {
    	size_t ixFirst;
    	size_t length;
    	vector<byte>>::const_iterator begin;
    	vector<byte>>::const_iterator end;
     
    	response_range() : ixFirst(), length(), begin(), end() {}
    	response_range(const vector<byte>> &response,vector<byte>>::const_iterator begin, &response,vector<byte>>::const_iterator end)
    		: begin(begin), end(end)
    	{
    		ixFirst = distance(response.begin(), begin);
    		length = distance(begin, end);
    	}
    };
     
    std::list<response_range> SplitResponse(const vector<byte>> &response, const vector<byte>> &delimiter)
    {
    	std::list<response_range> ret;
    	auto startit = response.begin();
    	vector<byte>>::const_iterator found;
    	while((found=search(startit, response.end(), delimiter.begin(), delimiter.end()))!=response.end())
    	{
    		ret.push_back(response_range(startit, found));
    		startit=found;
    		advance(startit, delimiter.size());
    	}
    	return ret;
    }
    Et c'est pour chaque response_range qu'il faut:
    1. Parser les en-têtes pour récupérer le nom de champ, comparer avec le nom du champ désiré
    2. Si c'est le bon, récupérer tous les bytes présents entre le \r\n\r\n et la fin de la range.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    J'utilise une autre méthode.
    Je crée un string dans un tableau de string, je délimite la ligne dès que je trouve le caractère saut de ligne soit '\n' pour en faire une ligne.

    J'ai donc fait:

    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
     
     
    		long i = 0;
    		while (filetemp.get(c))
    		{
    			//std::cout << "c: " << c << std::endl;
    			//tab[i] = c ;
    			strcpy(tab[i], c);
     
    			std::cout << "valeur du tableau, ligne: "<< i << " est: " << tab[i] << std::endl; //là pour le moment il print juste le caractère qui se trouve à tab[i]
    			if (c == '\n')
    			{
    				//std::cout << "valeur du tableau, ligne: " << i << "est: " << tab[i] << std::endl;
    				++i;
     
    				std::cout << "number of lines in if: " << i << std::endl;
    			}
    		}
     
                    std::cout << "valeur du tableau: " << tab << std::endl;
    Le problème et que je n'arrive pas à con caténé un caractère avec une chaine de caractère, cette chaine de caractère doit se trouver à l'indice i.
    Par exemple, tab[0] = "Bonjour"; et tab[1] = "Tout le monde"; .
    Y a t-il une méthode en C++ pour concaténé mes caractères les uns après les autres ?

    strcpy(tab[i], c); lui pète puisque j'essaye d'insérer un char dans un tableau de pointeur char on dirait bien, voilà l'erreur : 'char *strcpy(char *,const char *)'*: impossible de convertir l'argument 1 de 'char' en 'char *

  5. #25
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Ce que je ne comprend pas également c'est pourquoi
    valeur du tableau: ¯gæä#V╝zè░;£I│AMɽ ðQ&84¶üc
    , en soit ce sont des caractères qui ne sont pas dans mon fichier texte
    On dirait qu'il prend le dernier caractère de chaque ligne et qu'il concatène tout les derniers caractères de chaque clignes entre eux.

  6. #26
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Je fais suivre ce que j'ai dit au dessus, j'ai réussi, à récupérer seulement le contenu, hormis qu'il y ai un espace qui est pris en compte au début.
    J'ai cependant 2 questions.

    1/ça ne change rien si je n'ai pas le même nombres de lignes ?

    2/Une fois que j'ai le contenu, une idée pour générer le fichier ?

  7. #27
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Ok je crois que c'est bon, par contre j'ai un espace qui est pris en compte, je sais pas encore comment ne pas le prendre en compte si vous avez une idéePièce jointe 476659

  8. #28
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    "Pièce jointe non-valide."
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #29
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Je ne sais pas pourquoi ça n'a pas bien fonctionné.
    Je reposte ça ici:

    Nom : espacefile.png
Affichages : 194
Taille : 38,4 Ko

    ça peut peut-être arrivé aussi que certaines lignes suivant les fichiers peuvent être pris en compte au contraire, ça doit venir de mes regex.

    Je les postes ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::regex regContentDisposition1("\\b(Content)([^ ]*)");
    std::regex regContentDisposition2("(----------------------)([^ ]?)");

  10. #30
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    std::regex regContentDisposition2("(----------------------)([^ ]?)"); et les caractères de fin de lignes tu les enlèves quand ?
    Faut pas s'étonner que le fichier commence par... un saut de ligne/fin de ligne/ligne vide.
    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.

  11. #31
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    J'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::regex regContentDisposition1("\\b(Content)([^ ]*)");
    std::regex regContentDisposition2("(----------------------)([^ ]?)");
    std::regex regContentDisposition3("(\n\r\t)");
     
    if (!std::regex_search(stringBuffer, regContentDisposition1) && !std::regex_search(stringBuffer, regContentDisposition2) && !std::regex_search(stringBuffer, regContentDisposition3)  && stringBuffer != "\n")
    Mais j'ai toujours des sauts de lignes pourtant..

    ça doit probablement être un problème de syntaxe C++

  12. #32
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Je ne comprend pas.
    J'ai envoyé un fichier.mp3 à mon server depuis une page web, mais depuis, peut importe ce que je peux lui passer, même avec postman, il me retourne le même binaire.
    Comment expliquer cela ?

  13. #33
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Je reviens ici après avoir réussi à résoudre le problème pour mon premier saut de ligne qui faisait tout buguer, j'ai automatiquement supprimé la première ligne de ma string, j'ai un peu avancé, j'avais laissé de côté mon code un moment, mais j'ai un petit problème c'est que le dernier 1/4 ne fonctionne pas.
    C'est à dire, pour le cas d'une image, le fichier se génère bien jusqu'au 3/4 .
    J'avais réussi à le faire fonctionner correctement, mais maintenant je n'ai que les 3/4 qui fonctionne correctement.

    Je repose mes regex modifié ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    std::regex regContentDisposition1("\\b(Content)([^]*)");
    std::regex regContentDisposition2("(----------------------)([^]?)");
    std::regex regContentDisposition3("^//[^\n ^\r]*$");
    std::regex regContentDisposition4("(WebKitFormBoundary)");
    et mon code:
    (je vous passe une parti du code où je gère les fichiers stream..)

    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
     
     
    std::string stringTab;
    std::string stringBuffer;
     
    if (filetemp.good())
    	{
     
    		while (filetemp.get(c))
    		{
     
    			stringBuffer += c;
     
    			if (c == '\n')
    			{
     
    				if (!std::regex_search(stringBuffer, regContentDisposition1) && !std::regex_search(stringBuffer, regContentDisposition2) && !std::regex_search(stringBuffer, regContentDisposition3) && !std::regex_search(stringBuffer, regContentDisposition4))
    				{
     
    					if (mo != 0) {
     
    						stringTab += stringBuffer;
     
    						++i;
     
    					}
    					stringBuffer = "";
     
    					mo++;
    				}
    				else
    				{
    					stringBuffer = "";
    				}
     
    			}
    		}
     
    		secondfile << stringTab;
     
    		std::cout << "number of lines: " << i << std::endl;
    		filetemp.close();
     
    	}
    Voilà j'ai test comme ça, une fois que ça fonctionnera j'optimiserais le code.
    Si vous avez une petite idée, mon fichier se génère bien jsuqu'au 3/4, et ce avec tout les fichiers.

  14. #34
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    C'est bon problème résolu, ça ne venait ni des regex, ni des bout de code que j'ai montré au dessus.

  15. #35
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    J'ai toujours un soucis avec la génération de mes fichiers, quand je passe une fois un fichier différent, la fin du fichier est mal généré, si je repasse exactement le même, la seconde fois il est bien géré.
    Vous avez une idée ?

    je vous montre mon code ci-dessous où je m'en occupe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    auto fileBody = request.extract_vector().get(); //récupération du body de la requête
     
    std::ofstream file("bufferFile.txt", std::ios::in | std::ios::out | std::ios_base::binary);
     
    for (int i = 0; i < fileBody.size(); i++)
    {
    	file << fileBody[i];
    }
     
    std::ofstream secondfile("secondFile.txt", std::ios::in | std::ios::out | std::ios_base::binary | std::ofstream::trunc);
     
    auto exPath = path.string() + "\\bufferFile.txt";
    std::ifstream filetemp(exPath, std::ios::in | std::ios::out | std::ios_base::binary);
    Je bloque là dessus depuis un moment..

  16. #36
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    J'ai réussis ce que je voulais faire.
    Cependant j'ai une question j'ai un problème avec certains fichiers, principalement les fichiers vidéos, à un certain moment, je build le fichier vidéo, mais à un certain moment dans la lecture de la vidéo, celle-ci s'arrête pendant que la lecture continue.

    Mon premier doute est que chaque ligne passe dans une variable string, celle-ci doit avoir une limite comme tout les autres types, peut-être qu'à un moment, il n'interprète plus certains caractères ?
    Autrement je ne vois pas trop d'où peut venir le problème.

  17. #37
    Membre à l'essai
    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
    Points : 20
    Points
    20
    Par défaut
    OK problème résolu, j'ai résolu le problème tout seul.
    C'était un problème de regex.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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