Datei mit c++ an Webbrowser sende (POST)



  • 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