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

Réseau C Discussion :

Uploader un fichier en POST sur un PHP


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 10
    Points
    10
    Par défaut Uploader un fichier en POST sur un PHP
    Bonjours voila j'essaye de faire quelque chose comme un rapport de plantage pour mon prog,
    mais voila je ne sais pas comment faire pour l'uploader :/

    J'ai chercher un peux partous mais j'ai pas trouver de vrai réponse

    PS: je ne veux pas utiliser de library comme libcurl ect

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonsoir,

    Si tu ne veux pas utiliser de bibliothèque toute faite, il te faudra ouvrir un socket TCP vers le serveur que tu cherches à contacter, puis envoyer une requête HTTP.
    La requête en elle-même n'est pas très difficile puisque HTTP est un protocole texte. Tu peux dialoguer à coups de sprintf() et de write().

    La requête elle-même est exprimée sur la première ligne avec « POST /url-a-atteindre HTTP 1.1" (ou HTTP 1.0), puis suivent un certain nombre de headers transmis chacun sur une ligne et de la forme « Header: valeur ». Tu vas envoyer au minimum l'hôte à atteindre en toutes lettres si tu travailles en HTTP 1.1. Tu pourras passer beaucoup d'autres informations comme le Referer, les cookies en vigueur, les protocoles et langues reconnues, etc.

    Vient enfin une ligne vide pour indiquer la fin de la requête puis, éventuellement, les données complémentaires.

    Tu peux commencer par la page Wikipédia consacrée : http://fr.wikipedia.org/wiki/Hyperte...nsfer_Protocol
    Ainsi que par la dernière RFC officielle en vigueur : http://tools.ietf.org/html/rfc7230

    Mais le plus explicite et le plus rapide pour commencer consiste à écrire une page HTML avec un formulaire contenant les mêmes infos que celles que tu souhaites faire envoyer par ton programme, diriger l'action vers 127.0.0.1 (ta machine) et un port de ton choix, puis se mettre à l'écoute de ce port avec netcat. Tu verras alors en clair sur ton écran quelles sont les informations qui sont envoyés à un serveur web à ton navigateur et sous quelle forme. Tu n'auras plus ensuite qu'à écrire la même chose dans ton programme C, en prenant soin tout de même de rester à l'écoute de ce que dit le serveur, car une requête peut toujours échouer.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup de t'a réponse

    j'ai eu beau essayer mais je n'y arrive vraiment pas :/

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et comment as-tu fait jusque là?

    Montre nous un peu de code, qu'on puisse t'aider
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Le voici :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <winsock2.h>
     
    int main(int argc, char **argv)
    {
        WSADATA WSA;
        SOCKADDR_IN sain;
        SOCKET sock;
        struct hostent* ht;
        char rec[512] = {0};
     
        ht = gethostbyname("http://xxx.xx/");
     
        WSAStartup(MAKEWORD(2, 2), &WSA);
     
        sain.sin_family = AF_INET;
        sain.sin_addr.s_addr = *(u_long *)ht->h_addr;
        sain.sin_port = htons(80);
     
        sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     
        connect(sock, (SOCKADDR *)&sain, sizeof(sain));
     
        send(sock, "POST /pnc.php HTTP/1.1 \r\n\r\n", strlen("POST /pnc.php HTTP/1.1 \r\n\r\n"), 0);
     
        recv(sock, rec, sizeof(rec), 0);
     
        printf("%s", rec);
     
        return 0;
    }

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Ce n'est pas mal du tout, mais pas suffisant.

    D'abord, les machines Microsoft ou apparentées utilisent des retours à la ligne du type « \r\n » là où les machines UNIX utilisent simplement « \n », mais cela ne devrait pas désarçonner le serveur. Ensuite, comme expliqué plus haut, il faut passer un certain nombre d'informations supplémentaires à ton serveur, à commencer par une ligne « Host: », optionnelle en HTTP 1.0 originale mais obligatoire si tu travailles en HTTP 1.1. Tu passes à cette ligne le nom de machine appelée tel que l'utilisateur l'a écrit, en principe, dans la barre d'adresse du navigateur. Ça signifie que ça peut éventuellement être une adresse IP numérique mais qu'il s'agit la plupart du temps d'un nom de serveur en toutes lettres. Passer cette information au serveur lui permet d'implémenter des name-based virtual hosts, c'est-à-dire différents sites hébergés par le même serveur à la même adresse mais distingués uniquement par leur nom. Ça va être typiquement le cas des home pages des abonnés d'un fournisseur d'accès.

    Il existe aussi « Content-Type ». Cette information t'est en général envoyée par le serveur pour t'indiquer le type de fichier qu'il t'envoie : une page HTML (text/html), un fichier texte (text/plain), une image ou toute autre chose… Ce champ « Content-Type » peut cependant être envoyé également par le client pour lui indiquer la nature et surtout le format des informations qu'il lui transmet.

    La liste des headers doit être terminée par une ligne vide, ce que tu fais déjà.

    Lors d'une requête GET, les arguments sont passés directement dans l'URL, après le « ? ». Donc pas de problème de ce côté-là. Lors d'un POST, aucun argument n'est transmis dans l'URL. Tout se fait dans le corps de la requête, ce qui permet entre autres choses d'envoyer des données de tailles plus importantes. La forme la plus simple consiste simplement à écrire sur une ligne, immédiatement après les headers et leur ligne vide, tout ce qui se trouverait en principe après le « ? » dans l'URL, et sous la même forme.

    Pour faire simple, télécharge un outil tel que Netcat pour te mettre à l'écoute d'un port. Mets-toi à l'écoute, par exemple, de « 127.0.0.1:12345 », c'est-à-dire le port 12345 de ta propre machine.

    Écris ensuite une petite page web comme celle ci-dessous et ouvre-la dans ton navigateur :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <html>
     <head>
      <body>
       <title>Test page</title>
      </head>
     </body>
      <h1>Test page</h1>
      <form action="http://127.0.0.1:12345/" method="get">
       <input type="hidden" name="cache" value="secret" />
       <input type="text"   name="texte" value="" />
       <input type="submit" name="envoi" value="OK" />
      </form>
     </body>
    <html>

    Saisis quelque chose dans le champ de texte puis clique sur OK. Ton navigateur se sera connecté au port que netcat est en train d'écouter et lui aura soumis une requête. Tu noteras que ton navigateur restera en attente tant que netcat, de son côté, n'aura pas « raccroché », c'est-à-dire refermé la connexion. Observe alors la fenêtre de netcat et tu verras alors exactement ce que ton navigateur a transmis au supposé serveur.

    Modifie à présent ta page HTML et remplace « method="get" » par « method="post" ». Regarde à présent où sont transmis tes arguments. Note également la valeur du champ « Content-Type ». Ajoute enfin une balise « INPUT type="file" » ainsi qu'une balise « TEXTAREA » pour te permettre d'envoyer facilement des données volumineuses et recommence. Vois de quelle manière elles sont transmis ainsi que, là encore, la valeur du champ « Content-Type ».

    Si tu construis une requête basée sur le même modèle, ton serveur y réagira de la même façon et tu auras atteint ton but.
    Deux bémols toutefois :

    — N'inclus ni champs ni headers inutiles dans ta propre requête si tu ne comprends par leur signification ;
    — Garde à l'esprit que chacun des appels de fonction que tu as écris dans ton code peut échouer et qu'à chaque étape, il faudra s'assurer du bon déroulement de la transaction. Sache aussi que le serveur lui-même peut échouer (y compris pour raisons internes). Il faudra également vérifier que la requête a été correctement acceptée et aviser si ce n'est pas le cas.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Bon c'est bon j'abandonne sa fait 2 semaine et je n'y arrive vraiment pas

    Merci commême

Discussions similaires

  1. upload des fichier du poste client au serveur
    Par quick dans le forum JSF
    Réponses: 5
    Dernier message: 11/06/2008, 00h31
  2. [PHP-JS] Upload de fichier en passant par JAVASCRIPT + PHP
    Par polothentik dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/05/2008, 08h52
  3. [MediaWiki] Upload de fichier (marche que sur l'hebergement du wiki)
    Par bluefish63 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/04/2008, 12h54
  4. Réponses: 2
    Dernier message: 07/04/2008, 17h40
  5. upload de fichier et test sur extension
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 08/07/2007, 16h29

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