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

Inscrit
26 Janvier 2011
Messages
21
Reactions
0
#1
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:
#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.
 
A

Anonymous

Invité
#2
Une compression automatique ? Mais ton image est t-elle celle upload ?
 
Inscrit
26 Janvier 2011
Messages
21
Reactions
0
#3
Rien n'est affiché quand je regarde sur chrome mais sur internet explorer je vois ça:


Normalement l'image n'est pas compressée.
 

RedBust

Membre Actif
Inscrit
1 Decembre 2009
Messages
260
Reactions
0
#4
Déjà apprends tes bases, copier\coller un script de la documentation seulement pour lire un fichier c'est un peu hard :
http://www.cplusplus.com/reference/clib ... dio/fread/
Tu aurais pu traduire les commentaires au moins :roll:
Il ne faut pas envoyer le fichier en texte, c'est un format image.
Il faut :
1) Que tu te serves d'un flag sur la commande fread pour lire le fichier en binaire
2) Que tu l'envoies avec le bon header (Content-Transfer-Encoding:binary)
3) Que tu te serves de PHP pour écrire le fichier correspondant, encore avec un flag dans le fread et fwrite.
Je vais pas te donner le code tout fait, ça reste relativement simple il te suffit de modifier de trois flags dans le code client et serveur (que tu n'as d'ailleurs pas fourni).

Enjoy ;)
 
Haut Bas