Sockets und HTTP - Wie sende ich ein File?



  • Hallo,
    ich habe folgendes Poblem:
    Ich habe einen kleinen Server gebastelt, der auf HTTP-Basis einen Request oder Response, ich verwechsel das immer, zurückschickt. Mit einfachen HTML-Codes klappt das auch wunderbar. Jetz muss man ja in dem was der Server zurückschickt immer schön angeben, welchen Typ die Datei hat. Bei HTML ist das ja text/html. ICh habe mal ein bisschen gegoogelt und rausgefunden, dass man, wenn man eine Datei (zb. eine exe) senden will, man den Typ application/octet-stream benötigt.
    Also hab ich text/html durch application/octet-stream ersetzt. Das Problem ist allerdings ja, dass ich die Datei irgendwie als Stream senden muss, der Server allerdings einen Text zurücksendet. Kennt sich jemand damit aus und kann mir erklären wie das funktioniert, dass der browser den stream dann auch annimmt und runterläd?
    thx mfg jonas0999



  • jonas0999 schrieb:

    Das Problem ist allerdings ja, dass ich die Datei irgendwie als Stream senden muss, der Server allerdings einen Text zurücksendet.

    Nein, du kannst auch binäre Daten senden. Der Header der Antwort (Response) muss natürlich in Textform sein, die Nutzdaten können x-beliebige Bytes sein. Dass du die binären Daten nicht mit send( s, data, strlen(data), 0 ) sendest, sollte ja klar sein.
    Der Client (hier Browser) sollte den Stream einfach annehmen, dazu musst du nix zusätzlich machen.



  • Also ich arbeite mit den Komponenten von BCB und nutze Socket->SendText() und Socket->SendStream, wie wäre das dann zu verstehn. Soll ich erst den Header mit Socket->SendText und dann die Binärdaten mit Socket->SendStream senden oder wie genau? Weil ich hatte das schon ausprobiert...hat aber irgendwie nichso funktioniert.



  • jonas0999 schrieb:

    Soll ich erst den Header mit Socket->SendText und dann die Binärdaten mit Socket->SendStream senden oder wie genau?

    Soweit ich weiß, ja. Bin aber nicht sonderlich fit mit den VCL-Komponenten. Was genau hatte denn dann nicht funktioniert?



  • if(FileExists(buffer.SubString(6,i-6)))
    {
    TMemoryStream *StreamName = new TMemoryStream;
    StreamName->LoadFromFile(buffer.SubString(6,i-6));
    String length=IntToStr(StreamName->Size);
    String text="HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-Length: "+length+"\r\n";
    ServerSocket1->Socket->Connections[0]->SendText(text);
    ServerSocket1->Socket->Connections[0]->SendStream(StreamName);
    }
    

    buffer.SubString(6,i-6)) ist der dateiname logischerweise.
    so in der art dacht ich mir das. und wenn ich jetz die datei aufrufe startet er den download zwar aber irgendwie läd ers dann nich.



  • IMO fehlt da noch ein zusätzlicher Zeilenumbruch am Ende des Textes. Und sonst sieht's für mich OK aus, tut mir Leid, dann weiß ich auch nicht weiter.

    Du könntest aber mal deinen Netzverkehr mit "normalem" Netzverkehr beim Datei-Download abgleichen, z.B. mit der Software Wireshark.


Anmelden zum Antworten