Accueil > Forum > > > > [Socket] Envoi d'image par requête http post
[Socket] Envoi d'image par requête http post
mercredi 28 décembre 2011 à 14:01:34 |
[Socket] Envoi d'image par requête http post

sleepersh
|
Alors voilà, je viens poster ici car vous êtes sûrement ma dernière chance. Ca fait des jours que je cherche une solution à mon problème mais rien, personne n'a l'air de vraiment s'y connaître ou du moins, personne ne veut se donner la peine de répondre.
Voici mon problème (j'ai recopié-collé du site du zéro car c'est un peu long):
Bonjour,
Alors voilà depuis plusieurs jours déjà, je recherche à faire un uploader d'image qui utiliserait Qt et donnerait le lien de l'image uploadé après un drag and drop sur celui-ci (glissement de l'image sur le logiciel). Ce logiciel est destiné à être publique.
Mais nous n'en sommes pas là encore. Je n'en suis qu'au début et j'ai déjà des problèmes d'envoi d'image simple.
Mon image que j'essaie d'envoyer est celle-ci:  (104 octets d'après windows).
Pour envoyer mon image, j'utilise une requête http de type POST sur un formulaire déjà créé au préalable.
Cela évite donc de passer par le ftp (peut être risqué).
Oui mais voilà, quand je fais ça je n'ai pas 104 octets (ou plus) qui arrivent sur le serveur mais seulement 8 comme en témoigne cette image:
Il y a sûrement un problème d'envoi ou de lecture du fichier quelque part. Voici mon code:
Code C/C++ : #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "windows.h"
int main()
{
char *buffer;
char requete[1500];
int lSize = 0;
size_t result = 0;
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
FILE* image = fopen("C:\\Users\\Dardanboy\\Pictures\\w.png", "rb");
if (image == NULL){printf("Erreur !\n"); system("PAUSE"); return 0;}
fseek (image , 0 , SEEK_END);
lSize = ftell (image);
rewind (image);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,image);
if (result != lSize)
{
printf("lSize (taille image) = %d, result = %d, buffer = %02x\n", lSize, result, buffer);
fputs ("Reading error",stderr); exit (3);
}
printf("lSize (taille image) = %d, result = %d, buffer = %x\n", lSize, result, buffer);
sprintf(requete, "POST /upload/cible_envoi.php HTTP/1.1\r\n"
"Accept: text/html, application/xhtml+xml, */*\r\n"
"Referer: http://dardanboy.franceserv.com/upload/upload.php\r\n"
"Accept-Language: fr-CH\r\n"
"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n"
"Content-Type: multipart/form-data; boundary=---------------------------7db2c7420378\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"Host: dardanboy.franceserv.com\r\n"
"Content-Length: 292\r\n"
"Connection: Keep-Alive\r\n"
"Cache-Control: no-cache\r\n\r\n"
"-----------------------------7db2c7420378\r\n"
"Content-Disposition: form-data; name=\"monfichier\"; filename=\"w.png\"\r\n"
"Content-Type: image/x-png\r\n\r\n"
"%s\r\n"
"-----------------------------7db2c7420378--\r\n\r\n"
"\r\n", buffer);
sock = socket(AF_INET, SOCK_STREAM, 0);
/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr("178.33.214.192"); // ip de l'hébergeur
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
if(!erreur)
{
/* connexion grâce à connect */
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
printf("strlen(requete) = %d sizeof(requete) = %d\n", strlen(requete), sizeof(requete));
printf("\n\nrequete = %s\n\n", requete);
send(sock, requete, strlen(requete), 0);
/* On ferme la connexion */
fclose (image);
free (buffer);
closesocket(sock);
WSACleanup();
return 1;
}
else{
fclose (image);
free (buffer);
closesocket(sock);
WSACleanup();
printf("ERREUR: Impossible de se connecter à %s sur le port %d !", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
system("PAUSE");
return 0;
}
}
else{
printf("ERREUR !\n");
system("PAUSE");
return 0;
}
return 0;
}
Voici le résultat de la console:
Merci d'avance,
Dardanboy.
|
|
mercredi 28 décembre 2011 à 14:21:40 |
Re : [Socket] Envoi d'image par requête http post

CptPingu
|
Bonjour.
À première vu, la tête de la requête http semble correcte (la boundary est ok, tu utilises bien multipart/form-data et pas application/x-www-form-urlencoded). Il y a juste la taille "Content-Length: 292" que tu as mis "en dur". De même, il me semble que \n suffit (pas besoin de \r\n).
Peux-tu faire voir le code de reception ? (/upload/cible_envoi.php)
Je n'ai pas Windows (donc pas moyen de tester ton code), mais si tu me donnes une version plus portable de ton code (compatible Linux) je peux jeter un coup d'oeil. Au pire donne moi un accès à l'upload, je peux tenter d'uploader des images sur ton serveur.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mercredi 28 décembre 2011 à 14:35:55 |
Re : [Socket] Envoi d'image par requête http post

sleepersh
|
Alors pour l'uploader, j'accepte que tu upload des fichiers dessus pour faire des tests:
Page de référence: http://dardanboy.franceserv.com/upload/upload.php
Page d'envoi de l'image: http://dardanboy.franceserv.com/upload/cible_envoi.php
Répertoire des images: http://dardanboy.franceserv.com/upload/uploads/
Sinon quand à la réponse je ne reçois rien, recv() est toujours en écoute et rien ne s'affiche.
|
|
mercredi 28 décembre 2011 à 15:03:40 |
Re : [Socket] Envoi d'image par requête http post

Renfield
|
strlen ?
pour du binary...
ton souci est surement là
dans ton buffer requete
place ton entete
ajoute le contenu de ton PNG
ajoute la fin de la requette HTTP
et soumet
Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
|
|
mercredi 28 décembre 2011 à 15:06:30 |
Re : [Socket] Envoi d'image par requête http post

LA_Tupac
|
strlen ?
pour du binary...
Je confirme ça semble être un soucis de caractère "zéro" dans la chaine.
|
|
mercredi 28 décembre 2011 à 15:06:44 |
Re : [Socket] Envoi d'image par requête http post

CptPingu
|
Après recherche, ton problème est sur le strlen. C'est la raison pour laquelle ton image fait toujours une taille de 4.
En effet, le %s du printf ou le strlen ne fonctionne qu'avec une chaîne de caractères.
J'ai relancé ton exemple, sans réseau, et il y a bien un souci au niveau de l'écriture de l'image dans le buffer. Remplace ton "sprintf" par un "strncat" et ça devrait aller mieux ^^
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mercredi 28 décembre 2011 à 15:07:32 |
Re : [Socket] Envoi d'image par requête http post

CptPingu
|
Haha, grillé par Renfield et LA_Tupac :p
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mercredi 28 décembre 2011 à 15:44:13 |
Re : [Socket] Envoi d'image par requête http post

sleepersh
|
Si dans ce cas-là je n'utilise pas strlen() dans send(), que dois-je utiliser ? (sizeof ?)
J'ai remplacé mon code par un strncat et ça ne va pas mieux. J'ai essayé avec memcpy pour le buffer mais rien :s
Code:
Code C/C++ : #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "windows.h"
int main()
{
char *buffer;
char reception[10000], requete[2000];
int lSize = 0;
size_t result = 0;
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
FILE* image = fopen("C:\\Users\\albatron\\Pictures\\w.png", "rb");
if (image == NULL){printf("Erreur !\n"); system("PAUSE"); return 0;}
fseek (image , 0 , SEEK_END);
lSize = ftell (image);
rewind (image);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,image);
if (result != lSize)
{
fputs ("Reading error",stderr); exit (3);
}
printf("lSize (taille image) = %d, result = %d\n", lSize, result);
strncat(requete, "POST /upload/cible_envoi.php HTTP/1.1\r\n"
"Accept: text/html, application/xhtml+xml, */*\r\n"
"Referer: http://dardanboy.franceserv.com/upload/upload.php\r\n"
"Accept-Language: fr-CH\r\n"
"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n"
"Content-Type: multipart/form-data; boundary=---------------------------7db2c7420378\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"Host: dardanboy.franceserv.com\r\n"
"Content-Length: 292\r\n"
"Connection: Keep-Alive\r\n"
"Cache-Control: no-cache\r\n\r\n"
"-----------------------------7db2c7420378\r\n"
"Content-Disposition: form-data; name=\"monfichier\"; filename=\"w.png\"\r\n"
"Content-Type: image/x-png\r\n\r\n", 10000);
memcpy(requete, buffer, sizeof(buffer)+1);
strncat(requete, "\r\n"
"-----------------------------7db2c7420378--\r\n\r\n"
"\r\n", 10000);
sock = socket(AF_INET, SOCK_STREAM, 0);
/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr("178.33.214.192");// 62.50.35.202
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
if(!erreur)
{
/* connexion grâce à connect */
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
printf("strlen(requete) = %d sizeof(requete) = %d\n", strlen(requete), sizeof(requete));
printf("\n\nrequete = %s\n\n", requete);
if(send(sock, requete, sizeof(requete), 0) != SOCKET_ERROR){}
else{printf("Erreur avec send !\n"); system("PAUSE"); return 0;}
/* On récupère la réponse du serveur et on la met dans buffer*/
//recv(sock, buffer, sizeof(buffer), 0);
if(recv(sock, buffer, sizeof(buffer)+1, 0)!= SOCKET_ERROR){}
else{printf("Erreur avec recv !\n"); system("PAUSE"); return 0;}
printf("\nreception = %s", reception);
/* On ferme la connexion */
fclose (image);
free (buffer);
closesocket(sock);
WSACleanup();
return 1;
}
else{
fclose (image);
free (buffer);
closesocket(sock);
WSACleanup();
printf("ERREUR: Impossible de se connecter à %s sur le port %d !", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
system("PAUSE");
return 0;
}
/* send permet d'envoyer une requête à l'adresse scok. Dans ce cas, au site www.habbo.fr
la requête est de type http:
"GET /groups/jeux_sponso HTTP/1.0\r\n"
"Host: www.habbo.fr\r\n"
"\r\n"; */
}
else{
printf("ERREUR !\n");
system("PAUSE");
return 0;
}
return 0;
}
|
|
mercredi 28 décembre 2011 à 15:50:23 |
Re : [Socket] Envoi d'image par requête http post

CptPingu
|
Tu n'as pas intialisé "requête". Donc impossible de savoir ce que tu vas ajouter à "quoi".
De plus, pourquoi fais tu un memcpy sur "requete" ? Tu écrases ta précédente écriture.
Le mieux serait de faire du memcpy sur "requete + i" avec i la position où tu veux continuer à écrire.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mercredi 28 décembre 2011 à 19:54:49 |
Re : [Socket] Envoi d'image par requête http post

LA_Tupac
|
Haha, grillé par Renfield et LA_Tupac :p
héhé! au moins c'est la preuve que tu as plus pris le temps que nous d'analyser le problème avant de poster
Perso pour les buffers j'aime bien ajouter un espace à la fin car pas mal de fonctions (ma mémoire de piaf ne vous dira pas lesquelles) faussent complètement le résultat s'il y'a juste l'espace necessaire...
Code C/C++ : buffer = (char*) malloc (sizeof(char)*lSize);
//devient
buffer = (char*) malloc (lSize+1); //sizeof(char) ça ne change jamais
|
|
Cette discussion est classée dans : buffer, image, requete, http, sin
Répondre à ce message
Sujets en rapport avec ce message
Horoscope (recuperer sur site) [ par Tidam ]
Voila j'ai un probleme, avec mon code j'envoi une requette HTTP au serveur et il me renvoi exactement ce que je lui ai envoyé ... quelqu'un pourrait m
Winsock et les accents... [ par fredsor ]
Salut a tous, Voila j'ai realisé un projet, celui-ci consiste à récupérer une chaine de caracteres provenant d'une servlet distante.Bon jusque là rien
Recuperer contenu requete http [ par fredsor ]
Bonjour, Je voudrais me connecter a mon serveur local afin de recuperer le contenu par exemple d'un fichier txt.Grace a un code trouvé sur le site, j'
Problème dialogue socket [ par Crazy_Joe ]
Bonjour à tous, voilà j'ai un problème avec les sockets. Je voudrais me connecter au serveur pop de free sur le port 110 et récupérer le nombre d'ema
probleme boucles mutliple avec les sockets [ par miki42 ]
Bonjour a tous voila j'ai pa le choix,deja une semaine que je mord la langue pour trouver dou vient mon probleme mais rien y fait suit obliger de fari
traitement d'image [ par pops9542 ]
Bonjour, J'aimerais trouver des pistes sur le traitement d'image de l'image suivante(voir lien associé). Je ne recherche pas le code du traitement mai
probleme avec une boucle do while [ par miki42 ]
Bonjour a tous,voila je realise un logiciel de brute force ftp ceci etant pour améliorer mon niveau en programation,bref j'ai un probleme sur ma boucl
opengl 2d [ par djotto ]
Salut!Je cherche a créer une image 3D d'une taille supérieure à l'écran (ex 5000x5000) en OpenGL mais qui est fixe. Donc j'aimerais pouvoir me déplace
Probleme wsock protocole HTTP [ par Target67 ]
Alors je veux faire une petite appli qui permet de télécharger des fichiers sur le net suivant le protocole HTTP dont voici le code de la partie qui v
Socket Requette HTTP Post - Enlever le header de la réponse [ par SuperChouquette ]
Bonjour, je suis débutant et à l'aide d'autres sources j'ai créer une fonction pour envoyer une requete POST à un serveur web, celle-ci fonctionne bie
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|