Seite 1 von 1

Dateigröße aus Webfile auslesen?

Verfasst: 06.03.2007 22:54
von Jet1199
Hallo,
ich brauch (mal wieder) Eure geschätzte Hilfe.
Bereits vor einiger Zeit hatte ich das Problem, daß ich auswerten wollte, ob konkrete Dateien im Internet vorhanden sind. Eine Prozedur sollte meine lokale Datenbank Satz für Satz durchgehen und überprüfen, ob die zum Datensatz gehörigen Bilder bereits ins Internet hochgeladen wurden (das Hochladen geschieht nicht durch mich, fehlt jedoch ein Bild, dann möchte ich dazu eine Info haben).

Folgende Prozedur habt Ihr mir seinerzeit erstellt, sie übergab Serveradresse und Filename. Zurückgegeben wurde das Fundergebnis '200' als OK:

--------------------------

Code: Alles auswählen

Procedure WebFileExists(Server$, File$) 
  If InitNetwork() = #False : Debug "can't init network!" : Else 
    ServerID = OpenNetworkConnection(Server$, 80) 
    If ServerID = #False : Debug "can't connect to " + Server$ + " !" : Else 
      Request$ = "HEAD " + File$ + " HTTP/1.1" + #CRLF$ 
      Request$ + "Host: " + Server$ + #CRLF$ 
      Request$ + "Accepted: */*" + #CRLF$ 
      Request$ + #CRLF$ 
      
      SendNetworkString(ServerID, Request$) 
      
      Reply$ = Space(13) 
      ReceiveNetworkData(ServerID, @Reply$, Len(Reply$)) 

      CloseNetworkConnection(ServerID) 
      
      If Val(StringField(Reply$, 2, " ")) = 200 
        ;MessageRequester("Datei existiert! (Code 200 OK)", Reply$) 
        ProcedureReturn #True 
      EndIf 
    EndIf 
  EndIf 
EndProcedure ;WebFileExists
-----------------------------------------

Inzwischen erwarte ich, daß die Datei einfach vorhanden zu sein hat. Liegt kein Bild vor, dann muß dort wenigstens ein Dummy sein (ggf. lade ich das ersatzweise hoch).

Die neue Frage lautet nun: Ist eine konkrete Datei vorhanden? Es genügt für die Anwendung z.B., wenn die Dummy-Datei die erwartete Größe hat. Dann fehlt also das "echte" Foto.

Zusammengefaßt:
Wie frage ich ab, ob im Web eine konkrete Datei eine konkrete Dateigröße hat?

Danke für Eure Mühe im Voraus...

Verfasst: 07.03.2007 10:53
von stbi
Du solltest die Antwort des Webservers auf Deine HEAD-Anfrage weiter auswerten, nicht nur die erste Zeile, dann bekommst Du nämlich auch eine Zeile mit der Content-Length ... siehe Beispielantwort von meinem Webserver:

Code: Alles auswählen

HTTP/1.1 200 OK
Date: Wed, 07 Mar 2007 08:50:28 GMT
Server: Apache/2.0.52 (BlueQuartz)
Last-Modified: Mon, 15 Dec 2003 07:59:00 GMT
ETag: "60c304-c67-3f1af900"
Accept-Ranges: bytes
Content-Length: 3175
Connection: close
Content-Type: image/gif

Verfasst: 07.03.2007 11:11
von Jet1199
Hallo,
Danke für den Lösungsvorschlag. :allright:

Soll heissen es genügt, den Befehl
ReceiveNetworkData(ServerID, @Reply$, Len(Reply$))

sieben mal auszuführen, logischerweise erst beim 7. Befehl mit dem "richtigen" Variablennamen?

Wird heut abend gleich weitergebastelt.

Verfasst: 07.03.2007 12:43
von stbi
Jet1199 hat geschrieben:Soll heissen es genügt, den Befehl ReceiveNetworkData(ServerID, @Reply$, Len(Reply$)) sieben mal auszuführen, logischerweise erst beim 7. Befehl mit dem "richtigen" Variablennamen?
nein, der holt nämlich schon beim ersten Aufruf alle Zeilen der Serverantwort auf einmal rüber ...

Ich hab den Code mal ein wenig umgeschrieben. Diese Prozedur liefert Dir die Dateigröße. Oder -1, falls es die Datei nicht gibt bzw. ein Fehler aufgetreten ist:

Code: Alles auswählen

Procedure WebFileSize(Server.s, File.s) 

  Protected ServerID.l, Request.s, Buffer.s, Zeilenzahl.l, x.l
  
  Request = "HEAD " + File + " HTTP/1.1" + #CRLF$ + "Host: " + Server + #CRLF$ + #CRLF$
  
  #BufferSize = 1024
  Buffer = Space(#BufferSize)
  
  ServerID = OpenNetworkConnection(Server.s, 80) 
  
  SendNetworkString(ServerID, Request) 
  
  ReceiveNetworkData(ServerID, @Buffer, #BufferSize) 
  
  Buffer = RemoveString(Buffer, Chr(10))
  
  Zeilenzahl = CountString(Buffer, Chr(13)) - 1 ; die letzte Zeile ist immer leer
  
  For x=1 To Zeilenzahl
    Zeile.s = StringField(Buffer, x, Chr(13))
    If CountString(Zeile, "Content-Length") = 1
      Dateigroesse = Val(RemoveString(Zeile, "Content-Length: "))
      ProcedureReturn Dateigroesse
    EndIf
  Next
  
  ProcedureReturn -1      

EndProcedure 


InitNetwork()

Debug WebFileSize("www.robsite.de", "/bilder/banner/getfirefox.gif")
Das Auslesen der einzelnen Zeilen könnte man ggf. etwas eleganter machen, vielleicht fällt jemand ja noch was dazu ein. Aber auf jeden Fall tut es so was es soll.

Perfekt!

Verfasst: 08.03.2007 23:46
von Jet1199
Hi stbi,

Du hast mir sehr geholfen und ich möchte mich bedanken. Da ist Insiderwissen dabei gewesen, das mir beim besten Willen einfach fehlt. Ich habe Deine Prozedur auf meine Datei(en) umgemünzt und es geht. Grundlage dafür, was draus zu machen :allright:

CU - Jet1199