Per Browser funktioniert das Ganze prima - nur wie kann ich mit Purebasic damit Dateien hochladen?
Mir ist klar dass ich dafür nen Http Post machen muss, nur wie genau übergebe ich die Daten?
Danke schon mal
EDIT: Hab hier im Forum ein Beispiel gefunden, welches recht vielversprechend aussieht:
Ich hätte schon vor 5 ½ Stunden schreiben können, da hatte ich aber nur kurz Zeit, ins Forum zu schauen, ohne zu antworten.
Dafür kann ich ja noch jetzt schreiben.
Erstens ist dein Forumular nicht ganz korrrekt.
URL-Angaben enthalten keine Backslashes, sondern nur Slashes. Deshalb müsste es action="/service.py" heißen. Ich würde es so ändern, auch für den Fall, dass es trotzdem funktioniert. Nebenbei: Der Absendebutton braucht nicht zwingend einen Namen.
Deinen zusammengeklaubten HTTP-Request gehen wir allerdings jetzt nochmal durch.
Mich wundert es, dass es so klappt, der ist nämlich auch falsch.
Erstmal würde ich die aktuelle HTTP-Version 1.1 nehmen (1. Zeile), wobei das aber im Prinzip Wurscht ist. In der ersten Zeile hast du übrigens den richtigen Front- statt wie im Formular den Backslash gesetzt. In HTTP/1.1 ist die Angabe "Host" Pflicht, da sich heutzutage häufig mehrere Domains eine IP und damit einen Server teilen. Das heißt für dich: Ob nur zufällig oder absichtlich, die Host-Angabe sollte immer mit in den Header. Nur damit du das weißt. Dann kommt der Dateiinhaltstyp "Content-Type". Es gibt hier verschiedene, welchen Typ man exakterweise nehmen müsste, müsst ich selbst grad genauer recherchieren. Aber mit "multipart/form-data" liegst du schon richtig. Ist im Endeffekt aber egal, denn da du dein Phyton-Skript ja selbst kontrollierst, kannst du im Skript ja jeden Typ akzeptieren. Content-Length, das hast du richtig erkannt, ist ebenfalls eine Pflichtangabe (es sei denn, man nimmt einen anderen Requesttyp als POST) und bezeichnet die Dateigröße in Byte. Sobald der Request vollständig ist, wird er mit einer mit einer Leerzeile abgeschlossen! Und die fehlt bei dir bzw. steht an falscher Stelle (am Schluss). Merke: Nach den POST-Daten, also dem Dateiinhalt kommt rein gar nichts mehr, weder eine abschließende Leerzeile noch ein Zeilenumbruch.
Das war's.
Du könntest mit "Connection" noch wählen, ob die Verbindung offen bleiben ("keep-alive") oder geschlossen ("close") werden soll. Der Vorteil beim Offenlassen ist, dass die Verbindung nicht erneut aufgebaut werden muss, solltest du eh mehrere Dateien übertragen wollen.
danke für deine Antwort. Deine Kritikpunkte sind alle richtig (soweit ich das überblicke),
doch der obige Code ist nicht das, was ich am Ende benutzt habe.
Ich hab mit einem HTTP Analyzer den Request von Firefox mitgeschnitten und dann
angeändert für mein Programm verwendet. Hier mal ein Ausschnitt des Codes:
Stimmt, "application/octect-stream" ("Binärer Datenstrom") ist das, wonach ich neben "multipart/form-data" ("mehrteilige Formulardaten") gesucht hatte!
Jetzt, wo ich es sehe, fällt es mir wieder ein.
Nun, das mit dem "boundary" kenne ich nicht, ehrlich gesagt. Ich hatte mal eine Facharbeit über das HTTP-Protokoll geschrieben und kenne mich daher mit der Materie aus, aber da ist mir ein "boundary" nie begegnet. Mag sein, dass es funktioniert, aber ich würde den darin sehen, dass man Daten gezielt getrennt übertragen kann, je nach Dateityp und -menge. Ich will es dir nicht schlechtreden, aber ich würde es weglassen und alle Daten als einen Datenstrom senden. Irgendwie finde ich das besser und sicherer. Bin nicht sicher, ob das "boundary" da reingehören darf oder ob das ne FireFox-spezifische Sache ist.
OK, ich seh schon ich muss mich nochmal genauer reinarbeiten^^
Danke für die Info, milan!
Hey, es reichten 12 Seiten (abzüglich Quellenangabe-Seite, Inhaltsverzeichnis, Titelblatt, große Schrift (12pt), etc.). Wir hatten 6 Wochen Zeit und ich habe mich die Nacht vor dem Abgabetag hingesetzt und alles aus dem Kopf geschrieben, lediglich mit Code-Beispielen aber ohne Bilder! Hab trotzdem meine 1- kassiert, wegen ein paar Typos hier und da!
vielen Dank für dein Beispiel. Bin gerade auf der Suche nach einem Upload Beispiel,
da ich aus einem PB Programm eine Datei an einen Webserver senden möchte.
Ich bekomme leider vom Server immer ein Bad Request
@dige:
Das Problem wird sein, dass Purebasic-Strings Unicode sind und wenn du sie mit SendNetworkData binär verschickst, dann ist jedes zweite Byte 0. Somit ist dein Request-Header schon ungültig. Versuche den Request vorher mit Ascii() oder UTF8() umzuwandeln.