Seite 1 von 2

Problem, ein Bild aus dem Netz zu speichern

Verfasst: 17.05.2007 10:51
von Gubbie247
Hallo.
Ich versuche zurzeit ein bischen mit der flickr-API rumzuspielen, aber ich scheitere schon beim anfangen.
Ich möchte gerne ein bestimmtes Bild als Sprite zur verfügung haben. Der ansatz von mir ist jetzt, das runterzuladen und in eine Datei zu speichern.
Und da fangen die Probleme an.
Beispielurl: http://farm1.static.flickr.com/232/5018 ... f5dd_m.jpg
Die wird zusammengesetzt:

Code: Alles auswählen

network.s = "farm"+bild_farm+".static.flickr.com"
file.s = "/"+bild_server+"/"+bild_id+"_"+bild_secret+"_m.jpg"
Dann die Verbindung und der Header hergetellt:

Code: Alles auswählen

ID2 = OpenNetworkConnection(network, 80)
Header2.s = ""
Header2.s + "GET "+file+" HTTP/1.1" + Chr(10)
Header2.s + "Host: flickr.com" + Chr(10)
Header2.s + "Accept: */*" + Chr(10)
Header2.s + "Connection: Close" + Chr(10) + Chr(10)
Dann abgesendet und sollte empfangen werden:

Code: Alles auswählen

SendNetworkString(ID2, Header2)

*Buffer2 = AllocateMemory(200000)
Repeat
  Delay(2)
Until NetworkClientEvent(ID2) = 2
ReceiveNetworkData(ID2, *Buffer2, MemorySize(*Buffer2))
CloseNetworkConnection(ID2)
Aber er bleibt in der Schleife hängen. Was kann man da tun?
Und die zweite Frage: Wie mache ich aus den Daten, die dann vielleicht irgendwann kommen zuverlässig ein jpg-file?
Vielen Dank

PS. Ich habe keine Vollversion
edit: schade, ich dachte ich hätte ins anfängerforum gepostet. entschuldigung, anfänger halt.

Verfasst: 17.05.2007 23:57
von HeX0R

Code: Alles auswählen

InitNetwork()
UseJPEGImageDecoder()
bild_farm.s   = "1"
bild_server.s = "232"
bild_id.s     = "501887545"
bild_secret.s = "420905f5dd"
network.s     = "farm" + bild_farm + ".static.flickr.com"
file.s        = "/" + bild_server + "/" + bild_id + "_" + bild_secret + "_m.jpg"

ID2 = OpenNetworkConnection(network, 80)
If ID2
	Header2.s = ""
	Header2 + "GET " + file + " HTTP/1.1" + #CRLF$
	Header2 + "Host: flickr.com" + #CRLF$
	Header2 + "Accept: */*" + #CRLF$
	Header2 + "Connection: Close" + #CRLF$ + #CRLF$

	SendNetworkString(ID2, Header2)
	*Buffer2  = AllocateMemory(200000)
	TimeOUT.l = ElapsedMilliseconds() + 5000
	L.l       = 0
	Length.l  = 0
	Ges.l     = 0
	Repeat
		Select NetworkClientEvent(ID2)
			Case 2
				L = ReceiveNetworkData(ID2, *Buffer2 + Ges, MemorySize(*Buffer2) - Ges)
				If L > 0
					Ges + L
					If Length = 0
						;Search for End of Header
						A = FindString(PeekS(*Buffer2, Ges), #CRLF$ + #CRLF$, 1)
						If A
							;Search for Content-Length
							B = FindString(PeekS(*Buffer2, Ges), "Content-Length:", 1)
							If B
								;Serach for end of Content-Length
								C = FindString(PeekS(*Buffer2, Ges), " ", B + 17)
								If C
									Length = Val(Mid(PeekS(*Buffer2, A), B + 15, Len(PeekS(*Buffer2, A)) - C))
									Ges - A - 3
									;Overwrite Buffer, cause Header is now unnessesary
									MoveMemory(*Buffer2 + A + 3, *Buffer2, Ges)
								EndIf
							EndIf
						EndIf
					ElseIf Ges >= Length
						;O.k., thats the whole pic
						Break
					EndIf
				EndIf
			Case 0
				Delay(2)
		EndSelect
	Until TimeOUT < ElapsedMilliseconds()
	CloseNetworkConnection(ID2)
	If Ges And Length
		If OpenWindow(0, 420, 188, 252, 190, "Pic", #PB_Window_SystemMenu | #PB_Window_TitleBar) And CreateGadgetList(WindowID(0))
			ImageGadget(0, 5, 5, 330, 255, CatchImage(0, *Buffer2 , Length), #PB_Image_Border)
			While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
		EndIf
	EndIf
EndIf

Verfasst: 18.05.2007 01:00
von Fluid Byte

Code: Alles auswählen

UseJPEGImageDecoder()

Tempdir$ = GetTemporaryDirectory()

URLDownloadToFile_(0,"http://farm1.static.flickr.com/232/501887545_420905f5dd_m.jpg",Tempdir$ + "test.jpg",0,0)

OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ImageGadget(0,5,5,0,0,LoadImage(0,Tempdir$ + "test.jpg"))

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

Verfasst: 18.05.2007 10:45
von HeX0R
Wie er bereits sagte, hat er nur die Demo, da hilft die Api nicht.
Klar kann man das passend umwursten, aber man muss ja nicht alles verraten ;)

Verfasst: 18.05.2007 12:42
von Gubbie247
Vielen Dank.
Wenn ich versuche den ersten Code zu kompilieren, zeigt er die Fehlermeldung:
Constant not found: #CRLF$
kann ich das einfach durch ein Chr(10) ersetzen?
nach dem ersetzen:
POLINK: fatal error: File not found: 'MSVCRT.LIB'
warum geht das nicht? :cry:

Verfasst: 18.05.2007 16:50
von HeX0R
#CRLF$ ist, wie die Konstante ja schon vermuten lässt: Chr(13) + Chr(10).
Warum die der Demo nicht bekannt sein sollte, ist mir allerdings schleierhaft.

Dein Fehler kommt durch den Einsatz des Jpg-Decoders, der offensichtlich in der Demo nicht wirklich unterstützt wird.

Verfasst: 18.05.2007 16:55
von ts-soft
HeX0R hat geschrieben:#CRLF$ ist, wie die Konstante ja schon vermuten lässt: Chr(13) + Chr(10).
Warum die der Demo nicht bekannt sein sollte, ist mir allerdings schleierhaft.
Ist eine API Konstante. Die Demo wird nur die #PB_ Konstanten kennen :wink:

Verfasst: 18.05.2007 17:14
von HeX0R
Aha!
Fred ist ja richtig konsequent ;)

Verfasst: 19.05.2007 10:12
von Gubbie247
Funktioniert das erste Skript denn? Ich habe mal versucht den jpg-decoder aussen vor zu lassen und das ganze in einer Datei zu speicher, aber es kommt nie zu dem 'Case 2', es kommt nichts an. Das geht doch mit anderen webseiten, warum hier nicht?

Verfasst: 19.05.2007 17:11
von HeX0R
Jo, das erste geht, sonst hätte ich es gar nicht erst veröffentlicht.
Wahrscheinlich hast du wieder nur Chr(10) verwendet anstatt Chr(13) + Chr(10) , weil das mag der Server nicht wirklich und sendet dann nix.