Datei mittels C++ auf Server hochladen



  • Hallo!

    Ich hab mal was gecodet. Ein Programm, welches die Formulardaten in C++ einliest. Ich gebe zu, das es etwas wild ist, aber egal.

    Folgendes Problem:
    Die GET und POST Daten lassen sich einlesen. Selbst, wenn das Formular als multipart/form-data encodiert ist. Lade ich jetzt eine Textdatei hoch, kommen alle Daten einwandfrei rein. Lade ich eine Binäre Datei hoch, erscheinen mir die übermittelten Daten irgendwie falsch.

    Wenn ich das richtig verstehe, kommen die Daten der hochgeladenen Datei nach dem Spruch "Content-Type: application/octet-stream", oder? Schaut euch mal die Debug-Ausgaben meines Programms an.

    Info zu dem Formular: Es befinden sich zwei Textfelder mit den Namen "textfield1" und "textfield2" darin. Außerdem zwei file-Felder mit den Namen "file1" und "file2". Ja, auch ein Submit-Button ist drin.

    Zuerst einmal der Code meines Programms:

    #include <cstdio> 
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    int main() { 
        /* Variablen deklarieren */ 
        int pos; 
        int postlen; 
            char * pcReqMtd; 
            char * pcQuery; 
            char * pcContent; 
            char * pcCType; 
            char * post; 
            char * tmp; 
            string pcCINGET; 
            string CType; 
    
            /* HTML-Header printen */ 
            cout<<"Content-type: text/html\n\n"<<endl; 
    
        /* Request-Methode auslesen */ 
            pcReqMtd = getenv("REQUEST_METHOD"); 
    
        /* Ist der Request GET */ 
        if(strcmp("GET",pcReqMtd) == 0) { 
            pcQuery = getenv("QUERY_STRING");    
                cout<<"REQUEST_METHOD : "<<pcReqMtd<<"<br>"<<endl; 
                cout<<"QUERY_STRING : "<<pcQuery<<"<br>"<<endl;    
    
        } 
    
        /* Ist der Request POST */ 
        if(strcmp("POST",pcReqMtd) == 0) { 
            /* Content-Type und Content-Length lesen */ 
            pcCType = getenv("CONTENT_TYPE"); 
            pcContent = getenv("CONTENT_LENGTH"); 
    
            /* Umwandlung von char in string, und suchen 
               nach einem Semikolon, um herauszufinden, ob 
               der Content-Type normal, oder multipart... ist */ 
            CType = pcCType; 
            pos = CType.find(";",0); 
            if(pos > -1) { CType.assign(pcCType,0,pos); } 
    
            /* Normales POST-Form */ 
            if(CType == "application/x-www-form-urlencoded") { 
                getline(cin, pcCINGET);    
                cout<<"REQUEST_METHOD : "<<pcReqMtd<<"<br>"<<endl; 
                    cout<<"CONTENT_TYPE : "<<pcCType<<"<br>"<<endl; 
                cout<<"CONTENT_LENGTH : "<<pcContent<<"<br>"<<endl; 
                cout<<"PARAMETER´S : "<<pcCINGET<<"<br>"<<endl; 
            } 
    
            /* POST-Formular mit multipart/form-data */ 
            if(CType == "multipart/form-data") { 
                /* Infos ausprinten */ 
                cout<<"REQUEST_METHOD : "<<pcReqMtd<<"<br>"<<endl; 
                    cout<<"CONTENT_TYPE : "<<pcCType<<"<br>"<<endl; 
                cout<<"CONTENT_LENGTH : "<<pcContent<<"<br>"<<endl; 
    
                /* Daten einlesen */ 
                postlen = atoi(pcContent); 
                if (postlen > 0) { 
                          post = new char[postlen+1]; 
                       tmp  = new char[postlen+1]; 
                          strcpy(post, ""); 
                       while(postlen>0) { 
                                 strcpy(tmp, ""); 
                           fgets(tmp, postlen+1, stdin);   
                           postlen -= strlen(tmp)+1; 
                           strcat(post, tmp); 
                       } 
                   } 
    
                /* POST-Daten ausgeben */ 
                cout<<"POST : "<<post<<"<br>"<<endl; 
            } 
        } 
            return 0; 
    }
    

    Das ist die DEBUG-Ausgabe, wenn ich eine Textdatei hochlade:

    REQUEST_METHOD : POST
    CONTENT_TYPE : multipart/form-data; boundary=---------------------------7d42cea4020a
    CONTENT_LENGTH : 863
    POST : -----------------------------7d42cea4020a Content-Disposition: form-data; name="textfield1" Wert1 -----------------------------7d42cea4020a Content-Disposition: form-data; name="textfield2" Wert2 -----------------------------7d42cea4020a Content-Disposition: form-data; name="file1"; filename="C:\test.txt" Content-Type: text/plain [TEXT_BEGIN] Hallo, und Willkommen zu diesem Testtext. Dieser Text wurde erstellt, um den File-Upload meines C++ Programms zu testen. Wenn man diesen Text jetzt lesen kann, hat der Test funktioniert. [TEXT_ENDE] -----------------------------7d42cea4020a Content-Disposition: form-data; name="file2"; filename="" Content-Type: application/octet-stream -----------------------------7d42cea4020a Content-Disposition: form-data; name="Submit" Abschicken -----------------------------7d42cea4020a--

    Das ist die DEBUG-Ausgabe, wenn ich eine binäre Datei hochlade:
    Es ist ein EXE. Das compilierte EXE meines Programms.

    REQUEST_METHOD : POST
    CONTENT_TYPE : multipart/form-data; boundary=---------------------------7d4251104020a
    CONTENT_LENGTH : 90790
    POST : -----------------------------7d4251104020a Content-Disposition: form-data; name="textfield1" Wert1 -----------------------------7d4251104020a Content-Disposition: form-data; name="textfield2" Wert2 -----------------------------7d4251104020a Content-Disposition: form-data; name="file1"; filename="C:\Server\cgi-bin\cgi.exe" Content-Type: application/octet-stream MZ$-‹MèójjèÉ

    Vielleicht könnt Ihr mir ja helfen!
    Besten Dank im voraus.

    Gruß
    Dannyc



  • hallo
    sieht nach einem doppelpost aus
    http://www.c-plusplus.net/forum/viewtopic.php?t=86550&sid=f8837cf1ccef4987b36eefd9aedf5b2c
    denke auch nicht, daß standard c++ da was zu sagt 😉

    aber schau dir dochmal (wenn auch ansi c und kein c++) diese seite an
    http://www.pronix.de/modules/C/openbook/c_programmierung_27.php
    da steht auch, wie man post auffängt.

    hatte deine datei damals getestet, du packst zuviel wieder in die datei zurück.

    leider keine zeit, näher zu forschen.. lerne grad.


Anmelden zum Antworten