2009-06-08 12 views
4

J'essaie d'envoyer un fichier et d'autres variables POST à ​​un script PHP sur mon serveur. Il n'y a pas de bonnes ressources sur Google et les exemples de code que j'ai trouvés ne fonctionnent pas. De préférence sans utiliser cURL.Téléchargement de fichiers via un HTTP POST en C++

+0

Pour quelle plate-forme codez-vous? –

Répondre

1

Je dirais rouler les vôtres. Ce n'est pas trop compliqué.

capture un post HTTP envoyé à partir d'un navigateur Wireshark et désosser au besoin en utilisant la spec comme guide. (Voir de Andreas Magnusson réponse ci-dessous pour des spécifications peut-être plus pertinentes.)

Je recommanderais cette approche personnellement pour apprendre le protocole plutôt que d'aller pure spec. C'est assez difficile d'apprendre des choses juste de la spécification. Je préfère explorer les différents comportements par des clients http connus et essayer de comprendre comment les choses fonctionnent en utilisant la spécification comme guide.

Formatez et envoyez les données en conséquence sur une socket une fois que vous êtes à l'aise avec HTTP.

En outre, si vous n'êtes pas familier avec la programmation de socket, consultez Beej's guide to socket programming.

+4

Wireshark ?? Sérieusement, lire la spécification et coder de cela devrait toujours être votre solution initiale, si le but est de rouler le vôtre. Ensuite, quand vous avez terminé et que la chose ne fonctionne toujours pas, et vous n'avez aucune idée pourquoi, il est temps de comparer votre sortie à celle d'un navigateur par Wireshark. Le réglage d'une capture Wireshark est l'équivalence HTTP de la programmation Cargo-Cult. –

+0

Ok, remplacez "tweak" par "reverse engineering pour en savoir plus sur le protocole". C'est assez difficile à apprendre à partir de spécifications, vous avez besoin de quelque chose à jouer avec. –

+1

Tout d'abord vous avez besoin de la spécification correcte (voir ma réponse) et ensuite vos tentatives initiales doivent toujours être conformes à la spécification, si cela ne fonctionne pas, diff: ing avec une capture Wireshark à partir d'une application qui fonctionne est toujours utile . –

2

Juste quelques ressources rendent assez facile de rouler votre propre

Voici an example of a GET request via ASIO (la bibliothèque réseau C++ Boost)

est ici the HTTP protocol made really easy

La requête GET comment vous pouvez voir n'importe quelle page sur votre site. Avec ce code, vous pouvez télécharger n'importe quelle page et l'obtenir en tant que texte brut. Comme vous pouvez le voir, il envoie un en-tête GET au serveur. Comme expliqué dans that HTTP protocol page, l'POST request ressemble à ceci

POST /path/script.cgi HTTP/1.0 From: 
[email protected] User-Agent: 
HTTPTool/1.0 Content-Type: 
application/x-www-form-urlencoded 
Content-Length: 32 

home=Cosby&favorite+flavor=flies 
  1. Pour envoyer un fichier:
  2. Vous mettez votre URL après le changement après
  3. le type de contenu au type de fichier que vous essayez de télécharger .
  4. Set Content-Length au nombre d'octets dans ce fichier
  5. Annexer le fichier après un retour de carrage (remplacer "home = Cosby & favori + saveur = mouches")
1

Une autre (plus Quick- n-dirty) est d'utiliser un utilitaire, via un appel system() ou similaire. Par exemple, l'utilitaire wget dispose d'une option --post-fichier.

4

Si vous voulez rouler le vôtre, vous aurez besoin du RFC for HTTP file uploading correspondant (googling sur "rfc http file upload" donnera le même résultat). Ce RFC montre également comment gérer une combinaison de fichiers et d'autres données FORM (ou variables POST). Le problème est bien sûr que vous aurez probablement envie de lire le MIME RFC ainsi ...

+0

+1 pour trouver la spécification la plus pertinente. –

1

cela fonctionnait très bien pour moi sur debian (http get, http post):

http://cpp-netlib.github.com

J'utilise v 0.9.3 qui nécessite un boost 1.49

Questions connexes