begin process at 2012 05 30 17:22:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

[Socket] Envoi d'image par requête http post


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS

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

Membre Club

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Membre Club

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


1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,025 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales