Download to Memory

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Download to Memory

Beitrag von Deeem2031 »

Da auf purearea.net ein schlechtes Beispiel für den Download einer Datei in den Speicher steht will ich hier mal meine Version posten.
Das mit den Parametern hab ich zwar nicht sehr schlau gelöst, mir ist aber keine bessere Lösung eingefallen.

Code: Alles auswählen

Procedure DownloadUrltoMem(*inURLoutBuffer.LONG,*Len.LONG)
  Protected Buffer, offset, hOpen, hFile, ret
  #INTERNET_OPEN_TYPE_DIRECT = 1
  #INTERNET_FLAG_RELOAD = $80000000
  
  offset = 0
  Buffer = AllocateMemory(1)
  If Buffer
    hOpen = InternetOpen_("", #INTERNET_OPEN_TYPE_DIRECT, "", "", 0)
    If hOpen
      hFile = InternetOpenUrl_(hOpen, PeekS(*inURLoutBuffer\l,*Len\l), "", 0, #INTERNET_FLAG_RELOAD, 0)
      If hFile
        Repeat
          InternetQueryDataAvailable_(hFile,@tlen,0,0)
          Buffer = ReAllocateMemory(Buffer,offset+tlen)
          InternetReadFile_(hFile, Buffer+offset, tlen, @ret)
          If ret > 0
            offset + tlen
          EndIf
        Until ret = 0
        InternetCloseHandle_(hFile)
      Else
        InternetCloseHandle_(hOpen)
        FreeMemory(Buffer)
        ProcedureReturn #False
      EndIf
      InternetCloseHandle_(hOpen)
    Else
      FreeMemory(Buffer)
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf
  
  *inURLoutBuffer\l = Buffer
  *Len\l = offset
  ProcedureReturn #True
EndProcedure

Url.s = "http://www.robsite.de/"
inURLoutBuffer = @Url
len = Len(Url)
If DownloadUrltoMem(@inURLoutBuffer,@len)
  MessageRequester("",PeekS(inURLoutBuffer,len))
  FreeMemory(inURLoutBuffer)
EndIf
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

Beitrag von bingo »

klasse :allright:

man kann da einiges mit machen ... :)

Code: Alles auswählen

Procedure DownloadUrltoMem(*inURLoutBuffer.LONG,*Len.LONG) 
  Protected Buffer, offset, hOpen, hFile, ret 
  #INTERNET_OPEN_TYPE_DIRECT = 1 
  #INTERNET_FLAG_RELOAD = $80000000 
  
  offset = 0 
  Buffer = AllocateMemory(1) 
  If Buffer 
    hOpen = InternetOpen_("", #INTERNET_OPEN_TYPE_DIRECT, "", "", 0) 
    If hOpen 
      hFile = InternetOpenUrl_(hOpen, PeekS(*inURLoutBuffer\l,*Len\l), "", 0, #INTERNET_FLAG_RELOAD, 0) 
      If hFile 
        Repeat 
          InternetQueryDataAvailable_(hFile,@tlen,0,0) 
          Buffer = ReAllocateMemory(Buffer,offset+tlen) 
          InternetReadFile_(hFile, Buffer+offset, tlen, @ret) 
          If ret > 0 
            offset + tlen 
          EndIf 
        Until ret = 0 
        InternetCloseHandle_(hFile) 
      Else 
        InternetCloseHandle_(hOpen) 
        FreeMemory(Buffer) 
        ProcedureReturn #False 
      EndIf 
      InternetCloseHandle_(hOpen) 
    Else 
      FreeMemory(Buffer) 
      ProcedureReturn #False 
    EndIf 
  Else 
    ProcedureReturn #False 
  EndIf 
  
  *inURLoutBuffer\l = Buffer 
  *Len\l = offset 
  ProcedureReturn #True 
EndProcedure 

Url.s = "http://www.tangerinedream.org/mod/gallery/media/thumbnails/10.jpg" 
inURLoutBuffer = @Url 
len = Len(Url) 
If DownloadUrltoMem(@inURLoutBuffer,@len) 
  UseJPEGImageDecoder() 
  ;Debug len ;->bildgröße in byte
  CatchImage(1, inURLoutBuffer) 
  FreeMemory(inURLoutBuffer) 
  OpenWindow(0,0,0,245,105,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"downloadimage²gadget")
  CreateGadgetList(WindowID(0)) 
  ImageGadget(0, 10,10,ImageHeight(),ImageWidth(),UseImage(1))
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
FreeImage(1)
EndIf
1:0>1
Antworten