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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

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

Beitrag 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 ?
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

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

Beitrag 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.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

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

Beitrag 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 ....
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

Bisonte hat geschrieben:Aus der verlinkten Seite entnehme ich diesbezüglich irgendwie nichts ....
hast Du einen Link zum nachgucken?

Grüße ... Peter
Hygge
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

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

Beitrag 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 ?
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

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

Beitrag 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.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

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

Grüße ... Peter
Hygge
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

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

Beitrag 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)
Zuletzt geändert von Bisonte am 30.07.2017 15:43, insgesamt 1-mal geändert.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

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

Beitrag 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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

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

Beitrag 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...
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten