Datei mit c++ an Webbrowser sende (POST)



  • Hallo cplusplus community,

    ich bin neu hier im Forum und hoffe ich habe hier den richtigen Berreich erwischt 🙂 Wenn nicht bitte verschieben.

    Also zu meiner Frage:

    Ich möchte eine simple Windows Application programmieren, die mir es ermöglicht dateien an ein Uploadscript (auf einem Webserver) zu senden. Das Uploadscript bekommt normalerweise die Dateien von einem HTML-Formular(input type=file...) . Jetzt möchte ich im Prinzip, das Uploadformular durch ein c++/c Programm ersetzen. Ist mein Vorhaben generell möglich/realisierbar oder nicht ?

    Vielen Dank Vorab für eure Antworten 🙂



  • Warum sollte dein Vorhaben nicht realisierbar sein? Die Frage eruebrigt sich.

    Schau' dir dazu am Besten das hier an:

    Generell: Du brauchst nur einen Stream, ein Socket, das sich ueber Port 80 mit einem Server verbindet. Darueber musst du einfach diese Daten als Text schreiben. Das war's im Prinzip. Das ergebnis, das du danach zurueck erhalten wirst, einfach auswerten, zur Ueberpruefung, und fertig ist das Leibgericht.

    Edit: Was du machen kannst, um selbst etwas zu forschen, ist folgendes: Nutze Firefox mit dem Live-Headers-AddOn und lass dir die Kopfdaten, die uebermittelt werden, einfach mal anzeigen. Sende kleine Textdateien und du wirst sehen, was dabei herauskommt.

    Ich vermute, dass Dateien verschluesselt / komprimiert uebertragen werden. Dafuer wuerdest du eine Bibliothek benoetigen. Genaueres kann ich dazu aber im Moment nicht sagen.



  • Danke für deine schnelle Antwort.
    Das hat mir bei meiner Problematik schon mal ein Stück weiter geholfen. 🙂

    Ich habe mir mal das Codebeispiel geschnappt und in die C++ Entwickungsumgebung gepackt.. Nur weis ich nicht was ich noch Importieren muss um die "HttpConnection" aus der Zeile: "HttpConnection conn = null;" bekannt zu machen. Kann mir da vielleicht jemand noch einen Tip geben ? Im Internet finde ich relativ wenig zu diesem Thema.

    Viele Dank Vorab 🙂 grüße



  • Das war uebrigens ein Beispielcode fuer Java, wenn ich das recht gesehen habe.
    Zu C++ und Sockets findet sich im Internet reichlich viel. Nur so viel vorab: Du behandelst den Stream wie eine Datei (fopen, fwrite, fclose, ...).



  • Ok habe mich ein bisschen mit Java auseinander gesetzt und jetzt mal testweise folgendes script zusammengebastelt:

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.UnknownHostException;
    import java.io.BufferedReader;
    
    public class upload {
    
    	public static void main(String[] args) throws IOException{		
    
    			URL url = new URL("http://www.xxxxxx.xx/?xxx=xxx");
    			InputStream i = url.openStream();    
    			int c = -1;
    			StringBuffer sb = new StringBuffer();
    			while ((c = i.read()) >= 0) {
    			    sb.append((char)c);
    			}
    			System.out.println(sb.toString()); 
    	}
    }
    

    so jetzt kann ich meine Webseite auslesen und wie kann ich einen POST mit einer Datei durchführen ? Hat jemand eine Idee ?



  • Du gehst die Schritte zu schnell. Du musst eigene Header senden, mit eigenen Angaben. Darunter fallen dann auch die Dateien. Die Haeder sind oben bereits beschrieben.

    Dein Programm sendet ein GET . Du musst aber ein POST senden, als Beispiel.

    Hier mal ein Python-Beispiel: stackoverflow.com

    Dateien werden also -- wie bei Emails auch -- per Base64 komprimiert.



  • heini schrieb:

    Dateien werden also -- wie bei Emails auch -- per Base64 komprimiert.

    Base64 ist ganz sicher keine Kompression, das Gegenteil ist schon eher der Fall. 🤡



  • Wie dem auch sei. Jedenfalls werden sie per Base64 bearbeitet und in die Header eingepflegt. Er braucht hier also eine Base64-Implementierung fuer C++ oder fuer welche Sprache er sich auch immer entscheiden wird.



  • heini schrieb:

    Wie dem auch sei. Jedenfalls werden sie per Base64 bearbeitet und in die Header eingepflegt. Er braucht hier also eine Base64-Implementierung fuer C++ oder fuer welche Sprache er sich auch immer entscheiden wird.

    Das ist falsch, weder werden die Dateien im Header übertragen noch Base64 kodiert.



  • Benutz doch einfach libcurl, dann brauchst dich nicht mit dem http Protokoll rumschlagen.



  • BierzeltOmi schrieb:

    Das ist falsch, weder werden die Dateien im Header übertragen noch Base64 kodiert.

    Wird aber im Beispiel so gemacht. Was waere denn deiner Meinung nach richtig?



  • Schreib bloß nicht deine eigene HTTP-Implementierung. Das ist ein schöner weg auf die Schnauze zu fallen. Vorallem wenn man wenig Erfahrung in dem Bereich hat. Zumindest sollte man die HTTP/1.1-RFC gründlich lesen. Aber idealerweise nimmt man eine fertige Implementierung wie libcurl!



  • heini schrieb:

    BierzeltOmi schrieb:

    Das ist falsch, weder werden die Dateien im Header übertragen noch Base64 kodiert.

    Wird aber im Beispiel so gemacht. Was waere denn deiner Meinung nach richtig?

    In welchem? In dem Java Beispiel von dir jedenfalls nicht.

    Scorcher24 hat natürlich trotzdem recht, nimm curl.



  • heini schrieb:

    Hier mal ein Python-Beispiel: stackoverflow.com

    Aber sie werden nicht komprimiert, sondern kodiert 🙂



  • Das einzige was bei HTTP Base64 codiert wird ist username und password für Basic Auth (GET). Sonst nix.



  • hm, is ja super das ihr mir alle helfen wollt, aber irgendwie kommt ich nicht weiter. 😞

    Gibt es vielleicht ein Beispiel für die Verwendung von libcurl, an dem ich mich orientieren kann?

    gruss



  • tecni schrieb:

    hm, is ja super das ihr mir alle helfen wollt, aber irgendwie kommt ich nicht weiter. 😞

    Gibt es vielleicht ein Beispiel für die Verwendung von libcurl, an dem ich mich orientieren kann?

    gruss

    http://curl.haxx.se/libcurl/c/libcurl-tutorial.html

    Fürs Guttenberg Pattern:

    //////////////////////////////////////////////////////////////////////////
    // Curl Callback
    static size_t my_curl_write( void *ptr, size_t size, size_t nmemb, void *f)
    {
            if ( ptr != NULL )
            {
                    Mainframe* frame = static_cast<Mainframe*>(f);
                    wxString b((char*)ptr);
                    frame->TellVersion(b);
            }
            return size*nmemb;;
    }
    
    void Mainframe::OnCheckVersion( wxCommandEvent& )
    {       
            CURL* curl = curl_easy_init();
            curl_easy_setopt(curl, CURLOPT_URL, "http://awesomescript.googlecode.com/svn/trunk/ass_version.txt");
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
            if ( curl_easy_perform(curl) != CURLE_OK ) 
            {
                    wxErrorBox(_("Could not connect to server. Please check Firewall or try later."), this);
            }
            curl_easy_cleanup(curl);        
    }
    

    Quelle


Anmelden zum Antworten