Datei aus Dem internet Downaloaden BMAX

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Datei aus Dem internet Downaloaden BMAX

BeitragMo, Feb 12, 2007 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
hi ich versuche eine datei aus dem www herunterzuladen, es geht halb danach smirrt er mir ab, warum?

hier der code, die datei gibt es wirklich!

Code: [AUSKLAPPEN]
Global SendSocket:TSocket

Download("http://purechannel.ath.cx/bmp.bmp","C:\bmp.bmp", 80)
End


Function Download(Inputfile$,outputfile$, Port%=80)

 Local host$
 Local host_tmp
 Local stream
 Local file

SendSocket:TSocket = CreateTCPSocket()
SendStream:TStream = CreateSocketStream(SendSocket)
ConnectSocket(SendSocket, HostIp("purechannel.ath.cx"), 80)


';------------------------------- Datei Anfordern
 WriteLine SendStream, "GET "+Inputfile$+ " HTTP/1.1"
 WriteLine SendStream, "Host: purechannel.ath.cx"
 WriteLine SendStream, ""
';------------------------------- Datei auf der Festplatte erstellen
 file = WriteFile(outputfile$)
';------------------------------- Das Ende des HTTP Headers suchen
 For a=0 To 100
  tmp$=ReadLine(SendStream)
  If Instr(Lower$(tmp), "content-type")>0 Then ReadLine(SendStream)  Goto ok
 Next
#ok
';------------------------------- Datei downloaden
 While Not Eof(SendStream)       
  WriteByte file, ReadByte(SendStream)
 Wend
';------------------------------- Alles wieder Schlie?en
 CloseFile file
 CloseSocket( stream)
End Function


wo ist da der fehler bitte um hilfe *verzweifelt* habe schon rumprobiert aber.... bekomm es nicht wirklich hin

Blitzcoder

Newsposter

BeitragMo, Feb 12, 2007 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du mal deinen Debugger bemühst, und sagst, was genau der Fehler ist, könnte man dir sicher helfen. Er "smirrt" ab ist keine besonders gute Fehlerbeschreibung.

Ansonsten, hast du eine Firewall laufen, und wenn ja hast du deinem Programm die Rechte gegeben?
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Mathias-Kwiatkowski

BeitragMo, Feb 12, 2007 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
habs nun, der bugger hat nix angezeigt

hier der CODE der 100% funktionsfähig ist

Code: [AUSKLAPPEN]
Global SendSocket:TSocket

Download("http://purechannel.ath.cx/bmp.bmp","C:\bmp.bmp", 80)
End


Function Download(Inputfile$,outputfile$, Port%=80)

 Local host$
 Local host_tmp
 Local stream
 Local file

SendSocket:TSocket = CreateTCPSocket()
SendStream:TStream = CreateSocketStream(SendSocket)
ConnectSocket(SendSocket, HostIp("purechannel.ath.cx"), 80)


';------------------------------- Datei Anfordern
 WriteLine SendStream, "GET "+Inputfile$+ " HTTP/1.1"
 WriteLine SendStream, "Host: purechannel.ath.cx" 
 WriteLine SendStream, ""
';------------------------------- Datei auf der Festplatte erstellen
 file = WriteFile(outputfile$)
';------------------------------- Das Ende des HTTP Headers suchen
 For a=0 To 100
  tmp$=ReadLine(SendStream)
  If Instr(Lower$(tmp), "content-type")>0 Then ReadLine(SendStream)  Goto ok
 Next
#ok
';------------------------------- Datei downloaden
 While Not Eof(SendStream)       
   ao:Int=ReadByte(SendStream)
   WriteByte file, ao
   a=a+1
   If a=2000 Then Delay 100 a=0
 Wend
';------------------------------- Alles wieder Schlie?en
 CloseFile file
 CloseSocket( SendSocket)
End Function


besondere abschnitte

ao:Int=ReadByte(SendStream)
WriteByte file, ao
a=a+1
If a=2000 Then Delay 100 a=0

wenn er nach 2000 "zeilen" keine pause hat so brätzelt er einfach ab
und mit dieser kleinen pause gehts immer noch schnell und zuverlässig!

vll ist das was fürs code topic

BtbN

BeitragMo, Feb 12, 2007 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Fein, aber wieso nicht einfach:

Code: [AUSKLAPPEN]
ReadStream("http::purechannel.ath.cx/bmp.bmp")


?

Jolinah

BeitragMo, Feb 12, 2007 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würds auch so machen wie BtbN.

Aber es geht natürlich auch manuell. Das hier ist jedoch nicht zuverlässig:
Code: [AUSKLAPPEN]
For a=0 To 100
  tmp$=ReadLine(SendStream)
  If Instr(Lower$(tmp), "content-type")>0 Then ReadLine(SendStream)  Goto ok
 Next


Content-Type muss nicht die letzte Zeile sein die in der Antwort enthalten ist, bevor der Inhalt dann kommt. Bei der Antwort verhält es sich wie bei der Anfrage, sie endet mit einer leeren Zeile. Stattdessen würd ich also sowas schreiben:

Code: [AUSKLAPPEN]
Repeat
  tmp$ = ReadLine(SendStream)
Until tmp$ = ""

Mathias-Kwiatkowski

BeitragMo, Feb 12, 2007 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function Download(Inputfile$,outputfile$, Port%=80)
file = WriteFile(outputfile$)
datei=ReadStream(Inputfile$)

While Not Eof(datei)
WriteByte file, datei
Wend
CloseStream datei
CloseFile file
End Function



warum geht der code nicht?
Download("http::purechannel.ath.cx/bmp.bmp","C:\test.bmp", Port%=80)

auf einmal hat er 5 mb obwohl die ursprungsgrosse irgendwie 700 kb ist

BtbN

BeitragMo, Feb 12, 2007 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Schreib deinen Code in SuperStrict
2. Dann fällt der fehler sofort auf.


(Er schreibt das fälschlicher weise erstellte Int-Handle endlos oft in die Datei(bis du ihn halt stoppst)).

Mathias-Kwiatkowski

BeitragMo, Feb 12, 2007 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
wie gehts dann richtig?

Vertex

BeitragMo, Feb 12, 2007 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal nebenbei: der Spaß mit dem http::blub unterstützt keine Redirections. Wenn A auf B redirected, dann lädt er nicht B herunter, sondern gibt einen Fehler zurück.
vertex.dreamfall.at | GitHub

BtbN

BeitragMo, Feb 12, 2007 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, dann läd man halt die Error-Seite runter.
Und: Benutzt SuperStrict!

Markus2

BeitragDi, Feb 13, 2007 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ende des HTTP Headers ist zweimal crlf also 13101310
ab da kommen Daten in der Länge die evtl. im Header angegeben ist
oder bis die Verbindung getrennt wird .
Und mal den Header auswerten .
 

E. Urbach

ehemals "Basicprogger"

BeitragSa, Feb 17, 2007 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
~edit~ Ich merke gerade, dass die Funktion bei der neuesten BMax-Version nicht immer korrekt funktioniert. Bitte meinen Post nicht beachten, solange ich den Fehler nicht korrigiert habe.

http://www.blitzprog.com/index...-download/

ReadStream würde ich niemals benutzen.
Ist einfach zu langsam und unzuverlässig, bei ReadLine und binären Dateien bin ich mir auch nicht sicher, ob es überhaupt funktioniert (wegen CR + LF).

Code: [AUSKLAPPEN]
DownloadFile("http://www.blitzprog.com/templates/Classic/img/blitzprog-software.png")

Code: [AUSKLAPPEN]
Function DownloadFile( URL$, SaveTo$="", D_port:Int=80 )
   
   Local t:TSocketStream
   Local stream_length:Long = 0
   
   Local path$ = StripDir(URL$)
   
   If Instr(URL$, "//")
      URL$ = Mid(URL$, Instr(URL$, "//")+2)
   EndIf
   If Instr(URL$, "www.")
      URL$ = Mid(URL$, Instr(URL$, "www.")+4)
   EndIf
   
   path$ = Mid(URL$, Instr(URL$, "/")+1)
   
   If Instr(URL$, "/")
      URL$ = Left(URL$, Instr(URL$, "/")-1)
   EndIf
   
   'TODO: file extensions
   If path$="" Then path$="index.php"
   
   'Rem
   Print URL$
   Print path$
   'WaitKey
   'End Rem
   
   t = ConnectToServer( URL$, "/" + path$, D_port)
   
   FlushStream(t)
   Local returns:String = ReadLine(t)
   While returns <> ""
      If Upper(Left(returns, 14))="CONTENT-LENGTH" Then
         stream_length = Long(Mid(returns, 17))
      EndIf
      returns = ReadLine(t)
   Wend
   
   Print ""
   
   If t=Null Then
      
      Print "Error"
      
   Else
      
      If SaveTo$="" Then
         SaveTo$ = StripDir(path$)
      EndIf
      If Instr(SaveTo$,"?") Then
         SaveTo$ = Left( SaveTo$, Instr(SaveTo$, "?")-1 )
      EndIf
      
      Local datei:TStream = WriteFile(SaveTo$)
      
      'Download
      Local time% = MilliSecs()
      CopyStream t, datei, 4096
      Print "Time: "+(MilliSecs() - time)
      
      CloseFile datei
      CloseStream t
      
   EndIf
   
End Function

Function ConnectToServer:TSocketStream( host:String, path:String, port:Int=80 )
   
   Local hsock:TSocket = CreateTCPSocket()
   ConnectSocket(hsock,HostIp(host),port)
   Local Stream:TSocketStream = CreateSocketStream(hsock,True)
   WriteLine(Stream,"GET " + path + " HTTP/1.0")
   WriteLine(Stream,"HOST: "+host)
   WriteLine(Stream,"")
   Return Stream
   
EndFunction

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group