Datei runterladen mit TCP - [ HTTP 1.1 GET ]

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ozzi789

Betreff: Datei runterladen mit TCP - [ HTTP 1.1 GET ]

BeitragFr, Jun 22, 2012 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich keine vernünftige/funktionierende Lösung gefunden habe, hier meine eigene Funktion!

Schnell und einfach eine Datei runterladen geht wie folgt: download_file("www.website.com/datei.doc","C:\Documents\datei.doc")
Die diversen Return codes helfen euch bei der Fehlersuche.


4.8.13 - Fixed (PHP Scripts mit Parameter klappen nun auch - saubere Terminierung)
BlitzBasic: [AUSKLAPPEN]
target_path$="C:\CHANGEME.png"

Print "Downloading"
Print "Return code: "+download_file("https://www.blitzforum.de/header/header.png",target_path$)
ExecFile (target_path$)

WaitKey


;If -1 is returned the TCP-Connection could not be established
;If -2 is returned the TCP-Connection got aborted when trying to send the GET-Request
;If -3 is returned the target file could not be written - check if it is a valid path & you have write rights
;If 1 is returned the download was successful

Function download_file(source$,target$)


Local max_download_bytes = 1024 , host$, file$

host$=splitt_fqdn(source$,1)
file$=splitt_fqdn(source$,2)

tcp=OpenTCPStream(host$,80) ;seite öffnen

If Not tcp Then Return -1


WriteLine tcp,"GET "+file$+" HTTP/1.1";Datei öffnen
WriteLine tcp,"Host: "+host$;Seiten host festlegen
WriteLine tcp,"Connection: close"
WriteLine tcp,"User-Agent: bb-dwnldr"
WriteLine tcp,Chr$(10)

If Eof(tcp) Then Return -2


Repeat
response$=ReadLine(tcp)
Until response$=""


Delay(2)


file=WriteFile(target$)
If file=0 Then Return -3

buffer = CreateBank(max_download_bytes)

While Not Eof(tcp)
Size = ReadBytes(buffer, tcp, 0, max_download_bytes)
WriteBytes(buffer, file, 0, Size)
Wend

CloseFile(file)
CloseTCPStream(tcp)

Return 1

End Function



Function splitt_fqdn$(url$,part)
Local pos=0


If Left(url$,7)="http://" Then pos=7
If Left(url$,8)="https://" Then pos=8

slash_pos=Instr(url$,"/",pos+1)
If part=1
Return Mid(url$,pos+1,slash_pos-pos-1)
ElseIf part=2
Return Mid(url$,slash_pos)
Else
Return "Invalid part parameter!"
EndIf
End Function




mfg ozzi


Nachtrag, PN von KnorxThieus, falls jemand das gleiche Problem hat Wink

"Ich bin auf dem Gebiet wirklich ein Laie, aber ich konnte von meiner neuen Domain eine Datei, die nicht auf der Wurzel gespeichert war, nicht mit deiner Funktion herunterladen – da kam immer etwas von einer "Found"-Fehlermeldung. Dem Webhosting-Betreiber war das Problem nicht bekannt.
Jetzt habe ich aber mal zum Vergleich die Datei mit dem Codeschnippsel aus der BB-Hilfe herunterladen, und dort ging es!

Ich habe in deinem Code die Zeile
Code: [AUSKLAPPEN]
WriteLine tcp,"GET "+file$+" HTTP/1.1"+crlf$+"Host: "+host$+crlf$+"Connection:close"+crlf$+"User-Agent: bb-dwnldr"+crlf$+"Cache-Control: no-cache"+crlf$


so hier angepasst:
Code: [AUSKLAPPEN]
WriteLine tcp,"GET "+source$+" HTTP/1.1"+crlf$+"Host: "+host$+crlf$+"Connection:close"+crlf$+"User-Agent: bb-dwnldr"+crlf$+"Cache-Control: no-cache"+crlf$

"
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
  • Zuletzt bearbeitet von ozzi789 am Do, Mai 14, 2015 17:50, insgesamt 5-mal bearbeitet

BtbN

BeitragFr, Jun 22, 2012 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hältst dich nicht an den HTTP Standard, der vorschreibt, jede header Zeile mit \r\n zu beenden.

ozzi789

BeitragDi, Jun 26, 2012 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt das nun so? Embarassed
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Propellator

BeitragDi, Jun 26, 2012 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso nicht einfach mehrere WriteLines? :/ Das fügt automatisch ein \r\n an, afair.

EDIT: Und du schliesst den TCP-Stream nicht.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group