Dateigröße aus Webfile auslesen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Dateigröße aus Webfile auslesen?

Beitrag 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...
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Beitrag 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.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Jet1199
Beiträge: 29
Registriert: 06.03.2005 00:33

Perfekt!

Beitrag 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
Antworten