Seite 1 von 2

HTTP Upload Request : Wie packt man ein File in den Request?

Verfasst: 30.07.2017 13:55
von Bisonte
Hallo...

Ich versuche mich gerade an einem Programm, das per HTTP-Post ein File hochladen soll.
Ich habe keinerlei Einsicht auf das php Skript der Gegenstelle, nur mal so vorweg.

Ich scheitere gerade an dem Request selbst.
Es steht dort geschrieben, dass die Daten " filedata (in HTTP forms known As type="file") " vorzuliegen haben.

Jetzt bin ich überfragt. Wie stecke ich also eine Binärdatei in diesen String des Requests ?
Sobald eine 0 auftaucht ist der String ja beendet.... wäre fatal ...

Code: Alles auswählen

Request.s = "?user=User&pass=Pass&filesize=AnzahlBytes&fn= ?????"
wobei in der Anleitung des "Skripts" dazu steht :

Code: Alles auswählen

[fn]               filedata (in HTTP forms known as type="file")
Wie muss also der "fn" Teil aussehen, wenn ich ein File übertragen möchte ?

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 14:17
von TroaX
Da PureBasic ja noch immer keinen POST-Request unterstützt, musst du sowieso CURL nehmen.

Außerdem musst du selber den Header manipulieren und den Request-Body entsprechend aufbereiten. Schau mal hier: https://developer.mozilla.org/en-US/doc ... ntent-Type

Das MDN von Mozilla ist für sowas immer eine gute Anlaufstelle.

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 14:31
von Bisonte
Ich mach das ganze ja per Curl... also das Senden und Empfangen von den Requests und deren Antworten ist nicht das Problem.
Mein Problem ist, wie das in dem String auszusehen hat....

Code: Alles auswählen

If ReadFile(0, #PB_Compiler_Home + "Examples\Sources\Data\Geebee2.bmp")
  Length = Lof(0)
  *Buffer = AllocateMemory(Length)
  If *Buffer
    ReadData(0, *Buffer, Length)
    
    ; So wie erstelle ich hier den "fn=" teil ?
    Request + "&fn=" + ????
  EndIf
  CloseFile(0)
EndIf
Das ist mein Problem.... Das Serverskript erwartet hier Daten....
Aus der verlinkten Seite entnehme ich diesbezüglich irgendwie nichts ....

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:01
von Kiffi
Bisonte hat geschrieben:Aus der verlinkten Seite entnehme ich diesbezüglich irgendwie nichts ....
hast Du einen Link zum nachgucken?

Grüße ... Peter

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:21
von Bisonte
TroaX hat geschrieben: Außerdem musst du selber den Header manipulieren und den Request-Body entsprechend aufbereiten. Schau mal hier:

https://developer.mozilla.org/en-US/doc ... ntent-Type
Äh der hier ?

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:27
von TroaX
Ich zitiere mal aus dem Link
The request looks something like this (less interesting headers are omitted here):

Code: Alles auswählen

POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575

---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description" 

some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt" 
Content-Type: text/plain 

[b](content of the uploaded file foo.txt)[/b]
---------------------------974767299852498929531610575
Der untere Teil ist die Datei. Das Boundary gibt einen Trenner zwischen den einzelnen Teilen (deswegen ja auch der Content-Type multipart/form-data). Zuerst kommt also der Request-Header mit der Content-Länge in Bytes sowie dem Typ des Inhaltes und der Boundary. Was du als Boundary nimmst kannst du selbst entscheiden. Aber meist wird ein Format wie dieses hier verwendet, weil es unwahrscheinlich ist, das die Binären Daten an einem Stück eine solche Sequenz enthalten.

Was das fn in der URL soll, kann ich dir nicht sagen. Wenn du über die URL Dateien übertragen willst, geht das nur mit Base64 und transformierung in etwas URL-Kompatibles (Austausch der Sonderzeichen gegen andere). Außerdem ist die Größe einer URL begrenzt. Bei ganz ganz ganz kleinen Dateien ist das kein Problem. Aber bei größeren wirste je nach Server ein Problem bekommen. Bei 2.000 Zeichen (ca. 1,3 KB) hast du noch Glück. Darüber ist die Gefahr, das entweder CURL oder der Server streikt.

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:31
von Kiffi
Bisonte hat geschrieben:Äh der hier ?
ich meinte eher einen Link zur Anleitung dieses ominösen Upload-Scripts.

Grüße ... Peter

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:39
von Bisonte
achso... das ist leider nur im eingeloggten zustand vorhanden, aber hier ein Auszug :

Code: Alles auswählen

Request To:        http://server/upload.php (use the exact url from Step "Create the upload session") ; Vorhanden

Required Vars:
[username]         account username ; Vorhanden
[password]         account password ; Vorhanden
[upload_session]   upload session name from Step 1 ; Vorhanden
[chunk_no]         set To "1" ; Vorhanden
[chunk_number]     set To "1" ; Vorhanden
[filesize]         filesize of current file in bytes ; Vorhanden
[fn]               filedata (in HTTP forms known As type="file") ; FEHLT !!!
[finalize]         set To "1" ; Vorhanden

Response:          URL;FILESIZE;MD5
Edit: Also das hier gilt für eine Übertragung in einem Stück....
Ziel des ganzen ist dann später die Übertragung "zerstückelt"... wegen einer Fortschrittsanzeige (und weil die Dateien auch mal etwas grösser werden können)

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:42
von TroaX
Bisonte hat geschrieben:achso... das ist leider nur im eingeloggten zustand vorhanden, aber hier ein Auszug :

Code: Alles auswählen

Request To:        http://server/upload.php (use the exact url from Step "Create the upload session")

Required Vars:
[username]         account username ; Vorhanden
[password]         account password ; Vorhanden
[upload_session]   upload session name from Step 1 ; Vorhanden
[chunk_no]         set To "1" ; Vorhanden
[chunk_number]     set To "1" ; Vorhanden
[filesize]         filesize of current file in bytes ; Vorhanden
[fn]               filedata (in HTTP forms known As type="file") ; FEHLT !!!
[finalize]         set To "1" ; Vorhanden

Response:          URL;FILESIZE;MD5
Ist denn sicher, das diese Variablen über die URL übergeben werden sollen oder sollen das POST-Variablen sein? Denn hier scheint es sich nicht um ein Standard-Konformes Uploadscript handeln. Und dafür müsste genau definiert sein, wie fn überhaupt aussehen soll. Ist damit der Part im Request gemeint oder nur die Datei in Bytes? Woraus bildet es den Dateinamen?

EDIT: Wie sieht Step 1 denn bitte aus?
[upload_session] upload session name from Step 1 ; Vorhanden

Re: HTTP Upload Request : Wie packt man ein File in den Requ

Verfasst: 30.07.2017 15:52
von Bisonte
Ich gehe stark von den POST Variablen aus. Im Teil womit man die SessionID ermittelt, sieht es genauso aus.

Im Grunde versuche ich eigentlich nur eine Html-"Form" per PB zu simulieren...

Code: Alles auswählen

<form enctype="multipart/form-data" action="http://server/upload.php" method="POST">
<table>
<tr><td>Uploadfile:</td><td><input name="fn" type="file" />
<input type="submit" value="Upload File" /></td></tr>
<tr><td>Session:</td><td><input type="text" name="upload_session" value="" /></td></tr>
<tr><td>Chunk_no:</td><td><input type="text" name="chunk_no" value="" /></td></tr>
<tr><td>Chunk_number:</td><td><input type="text" name="chunk_number" value="" /></td></tr>
<tr><td>Filesize:</td><td><input type="text" name="filesize" value="" /></td></tr>
<tr><td>Finalize:</td><td><input type="text" name="finalize" value="" /></td></tr>
<tr><td>Username</td><td><input type="text" name="username" value="" /></td></tr>
<tr><td>Password</td><td><input type="text" name="password" value="" /></td></tr>
<tr><td><input type="submit" value="Upload File" /></td></tr>
</table>
</form>
wenn ich der Beschreibung Glauben schenke...

Edit:
@Troax:

Das mit Teil 1 ist diese Beschreibung...

Code: Alles auswählen

        Request to:        http://server/session.php

        Required Vars:
        [username]         account username
        [password]         account password

        Response:          SESSIONNAME;SERVER
Sie stellt ja auch kein Problem dar, da ich schon die erforderlichen Daten von diesem Teil habe...